Ask questions or make suggestions about marketing, business development, or anything else relevant. This is the channel to discuss topics with Komodo team.
100 messages
Before 05-Dec-19 12:00 AM
kevinkatovic20-Sep-19 04:27 PM
So what is the block reward every 90 seconds 120 seconds it can't be random
ComputerGenie 👴👴👴20-Sep-19 04:28 PM
there are 8 coins given per block
on average 50% of blocks are mined by PoW
on average 50% of blocks are staked by PoS
"on average" because: math(edited)
kevinkatovic20-Sep-19 04:30 PM
Your not making sense your defending a already broken system thats being measured what is the network block reward for POW ever how many seconds then split the math properly your staking has always been a joke
SHossain20-Sep-19 04:30 PM
139k sol currently on pool. if you have 37k sol, you will get your share.
no one takes anyone's rewards from pool.
kevinkatovic20-Sep-19 04:31 PM
Its too unpredictable Im trying to measure this every 24 hours but you stats arn't stable. I again ask how often is POW block reward
I again ask how often is POW block reward
no set time. it's random. 50% PoW and 50% PoS
ComputerGenie 👴👴👴20-Sep-19 04:32 PM
Your not making sense your defending a already broken system
Why is it that you seem to have a problem mining any coin in this system and everyone else can mine and understand just fine?
At some point you might need to look around and realize that your problem is you and that's why you were booted from the PIRATE discord
kevinkatovic20-Sep-19 04:33 PM
I don't know why you are playing games like this I hate people that make something public but only annoy everyone.
ComputerGenie 👴👴👴20-Sep-19 04:33 PM
also
it's
You're not making sense.
When will I have enough for burial?
SHossain20-Sep-19 04:34 PM
how about if you keep the convo in #talk-mining channel which is appropriate for all mining related things
1
1
ComputerGenie 👴👴👴20-Sep-19 04:35 PM
No one forced you to mine LABS and all of the pool fees and chain details were available to you before you chose to mine it
kevinkatovic20-Sep-19 04:35 PM
Ok thanks everytime I try communicating with you guys I start to feel how truly annoying most of you are.

Note : miners call my pool umining as kind of nickname of unimining.net
I tried to explain labs 50% pos 50% pow on my discord but I was not very clear.
Maybe I missed few msgs (I will go to read arrr discord) but I guess that a website such as whattomine does not take into account pos part in profit calculation. Miner compared his earnings on my pool with this other pool http://mininglabs.rocks/workers/RDUJAMCMwcre4L1Dii5zq1XzGEHAEu94Rg and he said that a similar hashrate gave 12 times more. Do you know if website such as whattomine takes pos % into account ? And who is the pool op of mininglabs.rocks?
Sorry toaskhere but the conversation happened here
Markus21-Sep-19 05:59 PM
Hey, it would be great if someone from the team could apply for listing on Bitnordex exchange :)
Exchange link: https://www.bitnordex.com
Apply link on the bottom of the page.
BITNORDEX is a digital asset exchange platform based on the Huobi Cloud technology and currently offers trading and investment of more than 100 digital asset pairs including fiat-crypto trading, crypto-crypto trading, etc.
Nova's cryptocurrency exchange platform guarantees safe exchanges. Our cross-funcional platform securely provides exchanges to major cryptocurrencies like BTC, LTC and more..
hyperDEX21-Sep-19 08:21 PM
@polycryptoblog@Audo
Markus22-Sep-19 08:43 AM
Why no answer yet on this? Is there no interest to get listed on more exchanges or just ppl being too busy?
jl777c22-Sep-19 09:03 AM
what good does getting on some small exchange give?
Markus22-Sep-19 09:04 AM
BitNordex is a new nordic exchange they got all licenses required also a fiat gateway
jl777c22-Sep-19 09:09 AM
what sort of listing fees, vast majority of exchanges are basically just charging "only" 3 to 5BTC for listing, with no real trading volumes
Markus22-Sep-19 09:09 AM
Dont know listing fee
jl777c22-Sep-19 09:12 AM
anything other than a top 10 (real volume) exchange is really not worth listing on, as we are already in 3 of the top4 and almost half the top 10.
Markus22-Sep-19 09:13 AM
Maybe its free listing if they think the project is good thats why i thought it can be a great opportunity since its a new exchange with fiat gateway and everything they run is licensed
polycryptoblog22-Sep-19 06:01 PM
@Markus I will check them out , if it’s free listing can’t hurt. But not worth paying for an low volume exchange
2
Seko23-Sep-19 06:06 PM
There is an AtomicDEX Community Channel on Telegram. We try to help. Some questions, however, can only be answered by members and developers.
Would it be possible to get a Matterbridge Bot for AtomicDEX? So that the developers can answer via Discord?
Berg23-Sep-19 06:49 PM
Hi all :)
Hush was just added to https://CoinCollect.cc and I see that Komodo is already a supported coin. I was wondering the team's opinions on the project, and if it's open source
Buy, manage & trade your coins: mobile, easy & secure
1
polycryptoblog23-Sep-19 09:03 PM
@Berg Yes it is open source, it is run by some well known community / team members , @barv@Diesmaster
4
Berg24-Sep-19 02:31 AM
Ok, thank you! I heard it was an Asset Chain / Komodo community but didn’t know much about it
3
Glad to be aboard!
Thank you
LooTz24-Sep-19 04:37 PM
Hush is a great project fo sho(edited)
2
2
Berg24-Sep-19 08:34 PM
Feel free to join our Discord
https://discordapp.com/invite/QGPdzxH
We have an active HUSH airdrop on our #general channel, hosted by a community member
We also have a lottery running where you can buy a ticket for 10 HUSH Hope to see you there!(edited)
(as long as we have less than 50 people claiming the airdrop, you'll have enough for a ticket)
tomtom25-Sep-19 11:13 AM
not sure if this is the correct place to ask this question...i have 23 equahash miners
z9 mini's
is it worth it to mine kmd?
Markus25-Sep-19 11:14 AM
@tomtom You can use the channel #talk-mining there u will find ppl with great knowledge when it comes to mining
You should have posted "Binance approached us with an offer of $XX to promote cryptocurrency users to leave KMD on Binance's Exchange. This is a very high security risk which we HIGHLY DISSAPPROVE OF. If you do not hold the security keys to your crypto, then it is not your crypto - it belongs to the exchange you store it on. Millions of dollars have been REGULARLY lost on exchanges via exit scams, corruption etc. the latest being QuadrigaCX. Instead we are doubling down on educating the masses about proper coin security and we call upon ALL cryptocurrencies developers to do the same. The most secure way to collect KMD Interest Rewards is using our AGAMA wallet. Thank you."
Oszy26-Sep-19 11:02 PM
The most secure is ledger, and Agama is not "Ours" anymore. They never encouraged people to hold funds on an exchange, this post in my opinion was just formality, saying binance is doing the right thing by distributing the collected rewards which was not the case until now.(edited)
You are not getting more on binance than you would get in your wallet, but from a day trader point of view, who are keeping KMD on binance on a daily basis, it's not a bad thing to get those rewards while trading KMD.
Portman26-Sep-19 11:05 PM
The tweet itself enourages people to hold funds "Komodo is proud to be a member of the @binance Staking Platform."
Oszy26-Sep-19 11:06 PM
No it is not. It suggests that if you do have kmd there, you will get the rewards same as if it was in your wallet.
No one says to send it there and keep it there
ComputerGenie 👴👴👴26-Sep-19 11:06 PM
Sometimes, you take marketing where you can get it
and what is written is not taken as it was intended
Portman26-Sep-19 11:08 PM
The binace staking page the tweet links to: "With Staking, Binance users will be able to grow their funds by receiving monthly rewards & distributions simply by depositing and HOLDING FUNDS on Binance."
Oszy26-Sep-19 11:10 PM
said binance not komodo,my take on this is obviously not to do that
actionslacks26-Sep-19 11:10 PM
the wailing about lack of marketing has been deafening here in the past. if this binance gimmick had not been touted, the objections would likely outweigh your current complaint. I agree that binance is a cex and that comes with some pitfalls, but hey, it's the wild west.(edited)
Portman26-Sep-19 11:11 PM
THEN SAY THAT in the tweet
actionslacks26-Sep-19 11:11 PM
you want to leave your ass hanging out there, no one can stop you.
if more people buy kmd then the benefits might outweigh the lack of opsec principles
I am in no way affiliated with the team btw and my opinion is my own
I guess I shouldn't post here
ComputerGenie 👴👴👴26-Sep-19 11:18 PM
just wishes that someone would call them out for calling it "staking" and gives 0 shits about twitter other than that
1
1
Oszy26-Sep-19 11:18 PM
Yes, leave it to the team to answer
Portman26-Sep-19 11:23 PM
RE: Marketing: I have been/still do ultra praising of @jl777c 's work and compassionately critical of KMD marketing since Slack days. Marketing has been one red flag after another, my perception anyway. https://imgur.com/Av2tous
PTYX26-Sep-19 11:23 PM
If it's good for Komodo, I'm behind it.
3
actionslacks26-Sep-19 11:40 PM
do you have any constructive criticism concerning marketing @Portman ?
Portman26-Sep-19 11:53 PM
@actionslacks scroll up to this post for last suggestion: 'Portman 07/15/2019 New website.' You have any criticisms yourself?
actionslacks27-Sep-19 12:24 AM
I think that documentation needs some dumbing down, or maybe just a "kmd for dummies" type page. but honestly, as more people get red pilled into crypto, It's a race to the bottom for the hearts and minds of the pre-programmed masses.  But the Mobile Dex is the moon shot to mass adoption. seeing current progress makes me giddy in anticipation.
ComputerGenie 👴👴👴27-Sep-19 12:32 AM
There's only so much they can "dumb down" certain things
In my mind, I equate it to time-traveling back to the 1300s and trying to explain to someone from there how a 28 core and 56 thread CPU works
actionslacks27-Sep-19 12:33 AM
it's an epic task. to describe complex concepts that can be understood by the greatest amount of people possible.(edited)
ComputerGenie 👴👴👴27-Sep-19 12:33 AM
the details of how kmd has engineered many great solutions to as yet unforeseen problems just makes it that much more difficult to sell.
I'm not sure the outline can fit into an elevator pitch
fwiw, I'm not disagreeing that there should exist some "simplified" version of explaining it that doesn't make folks' eyes glaze over while they say "huh?"
just pointing out the difficulty level in coming up with such a thing
actionslacks27-Sep-19 12:38 AM
to understand the benefits of dPOW, aPOW and nSPV requires an understanding of something beyond, "buy this shitcoin and moon lambo naow", which is where 77.7% of crypto investors are at when it comes to technical inderstanding.(edited)
ComputerGenie 👴👴👴27-Sep-19 12:39 AM
"buy this shitcoin and moon lambo naow"
there's another reason?
1
actionslacks27-Sep-19 12:42 AM
I guess btc going from $100 to $20,000 tend to attract that kind of thing.
in the course of 4 yrs(edited)
ComputerGenie 👴👴👴27-Sep-19 12:43 AM
yes, BTC moon did more short-term damage to adoptability and people even caring what the space is about than good; that's for sure
actionslacks27-Sep-19 12:45 AM
I cared man! I want a better future! I didn't anticipate that I would end up profiting from the greed of the masses.(edited)
Portman27-Sep-19 12:45 AM
No need to detail anything to day traders who do not give a crap about the tech - the explanations need to be imparted to businesses and how/if they can benefit from the platform.
ComputerGenie 👴👴👴27-Sep-19 12:47 AM
the explanations need to be imparted to businesses and how/if they can benefit from the platform
I disagree, partially
imo, it needs to be equalized between business and "the every day man"
If the "average Joe" never gets it, then they'll never get why BTC isn't "the" thing and why they'd want anything else (much like it is now)
actionslacks27-Sep-19 12:52 AM
It's all about the user story. "why would I use this complicated, potentially illegal, method of value transfer when I could just start a bank account and get my debt slave tracking card?"
to which crypto says... "cause moon bro"
ComputerGenie 👴👴👴27-Sep-19 12:53 AM
"crypto? You mean that stuff that was on the news that people use for drugs and hitmen?"(edited)
between the news coverage of silkroad and TV only using it for ransomware, it's an uphill battle to start with(edited)
actionslacks27-Sep-19 12:56 AM
idk if you ever check out /biz/ but chainlink has some insane mass delusional phenomenon behind it.
I mean coinbase listed it. so how mich responsibility would be assumed by making it available?
1
ComputerGenie 👴👴👴27-Sep-19 12:58 AM
heads back to time with his wife
actionslacks27-Sep-19 01:00 AM
why not? there's my only relevant to this channel post.
Daniel CP27-Sep-19 06:45 AM
About the Binance tweet, Komodo isn't recommending Binance or suggesting that anyone store their funds on a CEX. But if KMD needs to be listed on CEXs (and it does) then it's best that users are able to earn their active user rewards, rather then the exchange itself taking those funds(edited)
2
2
It makes a lot more sense to stay friendly with Binance than to tweet some stuff about how we HIGHLY DISAPPROVE of them, which would be a quick way to get de-listed
Google just announced "Quantum Supremacy" & media went wild about what this means: Completely predictive climate models? Break encryption entirely? Should we be worried about bitcoin? 7pmET I chat to a Quantum Computing expert about the facts vs the hype.
https://t.co/qHA...
We should tell Naomi about KMD quantum security.
Patrick Friggens27-Sep-19 07:54 AM
Flashier wallet with the new antara color scheme would be nice too. You could add some bells and whistles too. Like tetris and arcanoid for the kids when they wait for block hight to catch up.


Jaiprakash Pow Standalone September 2019 Net Sales at Rs 755.41 crore, down 20.82% Y-o-Y
Reported Standalone quarterly numbers for Jaiprakash Power Ventures are:
Net Sales at Rs 755.41 crore in September 2019 down 20.82% from Rs. 953.99 crore in September 2018.
Quarterly Net Loss at Rs. 161.45 crore in September 2019 down 285.69% from Rs. 41.86 crore in September 2018.
EBITDA stands at Rs. 250.08 crore in September 2019 down 37.71% from Rs. 401.48 crore in September 2018.
Jaiprakash Pow shares closed at 1.15 on October 31, 2019 (NSE) and has given -59.65% returns over the last 6 months and -39.47% over the last 12 months.
| Jaiprakash Power Ventures | |
| Standalone Quarterly Results | in Rs. Cr. |
| Sep'19 | Jun'19 | Sep'18 | |
| Net Sales/Income from operations | 755.41 | 1,032.01 | 953.99 |
| Other Operating Income | -- | -- | -- |
| Total Income From Operations | 755.41 | 1,032.01 | 953.99 |
| EXPENDITURE | |||
| Consumption of Raw Materials | 471.10 | 685.00 | 551.10 |
| Purchase of Traded Goods | -- | -- | -- |
| Increase/Decrease in Stocks | -- | -- | -0.20 |
| Power & Fuel | -- | -- | -- |
| Employees Cost | 27.09 | 25.57 | 25.78 |
| Depreciation | 120.26 | 118.58 | 120.47 |
| Excise Duty | -- | -- | -- |
| Admin. And Selling Expenses | -- | -- | -- |
| R & D Expenses | -- | -- | -- |
| Provisions And Contingencies | -- | -- | -- |
| Exp. Capitalised | -- | -- | -- |
| Other Expenses | 24.64 | 20.79 | 20.72 |
| P/L Before Other Inc. , Int., Excpt. Items & Tax | 112.32 | 182.07 | 236.12 |
| Other Income | 17.50 | 5.49 | 44.89 |
| P/L Before Int., Excpt. Items & Tax | 129.82 | 187.56 | 281.01 |
| Interest | 377.22 | 367.08 | 369.75 |
| P/L Before Exceptional Items & Tax | -247.40 | -179.52 | -88.74 |
| Exceptional Items | -- | -- | -- |
| P/L Before Tax | -247.40 | -179.52 | -88.74 |
| Tax | -85.95 | -62.69 | -46.88 |
| P/L After Tax from Ordinary Activities | -161.45 | -116.83 | -41.86 |
| Prior Year Adjustments | -- | -- | -- |
| Extra Ordinary Items | -- | -- | -- |
| Net Profit/(Loss) For the Period | -161.45 | -116.83 | -41.86 |
| Equity Share Capital | 5,996.00 | 5,996.00 | 5,996.00 |
| Reserves Excluding Revaluation Reserves | -- | -- | -- |
| Equity Dividend Rate (%) | -- | -- | -- |
| EPS Before Extra Ordinary | |||
| Basic EPS | -0.27 | -0.19 | -0.07 |
| Diluted EPS | -0.27 | -0.19 | -0.07 |
| EPS After Extra Ordinary | |||
| Basic EPS | -0.27 | -0.19 | -0.07 |
| Diluted EPS | -0.27 | -0.19 | -0.07 |
| Public Share Holding | |||
| No Of Shares (Crores) | -- | -- | -- |
| Share Holding (%) | -- | -- | -- |
| Promoters and Promoter Group Shareholding | |||
| a) Pledged/Encumbered | |||
| - Number of shares (Crores) | -- | -- | -- |
| - Per. of shares (as a % of the total sh. of prom. and promoter group) | -- | -- | -- |
| - Per. of shares (as a % of the total Share Cap. of the company) | -- | -- | -- |
| b) Non-encumbered | |||
| - Number of shares (Crores) | -- | -- | -- |
| - Per. of shares (as a % of the total sh. of prom. and promoter group) | -- | -- | -- |
| - Per. of shares (as a % of the total Share Cap. of the company) | -- | -- | -- |
| Source : Dion Global Solutions Limited |


If several languages coalesce, the grammar of the resulting language is more simple and regular than that of the individual languages.
If several languages coalesce, the grammar of the resulting language is more simple and regular than that of the individual language.
Everyone realizes why a new common language would be desirable one could refuse to pay expensive that translators.
If several languages coalesce, the grammar of the resulting language is more simple and regular than that of the individual.


UMD client for Telepat, built with Webpack to run in browsers. Available on GitHub.
Telepat is an open-source backend stack, designed to deliver information and information updates in real-time to clients, while allowing for flexible deployment and simple scaling. Read more about how it works and why it's different here.
Documentation is available here, and you can check out a simple demo app here.
bower install telepat-js
, if you're using Bowernpm install telepat-js
, if you're using NPM<script src="lib/telepat.js"></script>
Clone the repo, then run npm install
. After editing the sources in the /src directory, run npm run build-all
to compile the libraries, and npm run docs
to generate the documentation.
Released under the Apache 2 License.
The Telepat
object is the first object you want to instantiate while working with the Telepat SDK.
It exposes methods and properties that enable you to register, login, subscribe to objects and to users.
let telepat = new Telepat();
telepat.connect({
apiEndpoint: 'TELEPAT-API-ENDPOINT',
socketEndpoint: 'TELEPAT-SOCKET-ENDPOINT',
apiKey: 'APP-API-KEY',
appId: 'APP-ID'
}, (err, res) => {
if (err) {
// Treat connection error
console.log(err);
return;
}
// Display all collections
console.log(telepat.collections);
// Login, display and update user data
telepat.on('login', () => {
console.log(telepat.user.data);
telepat.user.data.change = true;
});
telepat.user.login('user', 'pass');
// Subscribe to data
let articleChannel = telepat.subscribe({
channel: {
context: 'collection-identifier',
model: 'article'
}
}, () => {
console.log(articleChannel.objectsArray);
articleChannel.objects['object-identifier'].title = 'new title';
articleChannel.on('update', (operationType, objectId, object, oldObject) => {
// Update interface on data updates
});
});
});
Indicates whether the current instance is connected to the backend
Indicates whether the current instance is in the process of connecting to the backend.
If true, the connect
event will be fired as soon as connection is established.
Indicates whether the current instance is properly configured and ready for connection.
If connected, this property reflects the current app id.
This object contains details about all the collections available for the currently connected application.
You can read this after the connect
event is emitted, or if the connected
property is true.
Each available collection is stored as an Object, using a key whose name is equal to the collection's id.
Modifications to collection objects stored within will be automatically synchronized with the Telepat backend.
This object contains references to all of the Channels that are actively subscribed. Each channel is stored using a key equal to the channel's unique identifier.
This property becomes available after successfully logging in as an administrator. It gives you access to a instance of the Admin class, allowing you access to administrator functionality.
<EMAIL_ADDRESS>'password', (err) => {
if (err) {
// Treat login error
} else {
telepat.admin.getAppUsers((err) => {
if (err) {
// Treat error
} else {
// Treat success
console.log(telepat.admin.users);
}
})
}
});
An instance of the User class, this allows you to access user functionality like logging in, accessing and modifying current user data or registering new user accounts.
telepat.user.login('email', 'password', (err) => {
if (err) {
// Treat login error
} else {
// Treat successful login
console.log(telepat.user.data);
}
});
Call this to configure Telepat server endpoints without connecting to a specific app.
([Object](default {}))
Object containing all configuration options for connection
| Name | Description |
|---|---|
options.apiEndpoint string
|
The Telepat API endpoint URL |
options.socketEndpoint string
|
The Telepat socket endpoint URL |
options.reauth [boolean]
(default false )
|
Should reauth previously logged in user on connection |
([TelepatCallback](default () => {}))
Callback invoked after configuration is finished
let telepat = new Telepat();
telepat.configure({
apiEndpoint: 'TELEPAT-API-ENDPOINT',
socketEndpoint: 'TELEPAT-SOCKET-ENDPOINT'
}, (err, res) => {
// Handle configuration
});
Call this to connect to a specific Telepat app. This is usually the first thing you need to do after instantiating the Telepat object.
([Object](default {}))
Object containing all configuration options for connection
| Name | Description |
|---|---|
options.appId string
|
Your app id |
options.apiEndpoint [string]
|
The Telepat API endpoint URL. If this is absent from the connect options, it must have been previously set by calling configure . |
options.socketEndpoint [string]
|
The Telepat socket endpoint URL. If this is absent from the connect options, it must have been previously set by calling configure . |
options.apiKey string
|
Your app API key |
options.persistentConnection [Object]
(default null )
|
Set this to configure receiving updates via persistent channels, like push notifications. |
options.ioOptions [Object]
(default {} )
|
Configuration options for socket.io |
options.updateUDID [boolean]
(default false )
|
Set this to true to force the client to update the saved device identifier. |
options.timerInterval [number]
(default 150 )
|
Frequency of running diff (in miliseconds) to check for object updates. |
options.reauth [boolean]
(default false )
|
Should reauth previously logged in user on connection |
([TelepatCallback](default () => {}))
Callback invoked after configuration is finished
// Simple connection to backend
let telepat = new Telepat();
telepat.connect({
apiEndpoint: 'TELEPAT-API-ENDPOINT',
socketEndpoint: 'TELEPAT-SOCKET-ENDPOINT',
apiKey: 'APP-API-KEY',
appId: 'APP-ID'
}, (err, res) => {
// Handle connection
});
// Using connection event
let telepat = new Telepat();
telepat.connect({
apiEndpoint: 'TELEPAT-API-ENDPOINT',
socketEndpoint: 'TELEPAT-SOCKET-ENDPOINT',
apiKey: 'APP-API-KEY',
appId: 'APP-ID'
});
let connectCallbackId = telepat.on('connect', {
telepat.removeCallback(connectCallbackId);
// Handle connection
});
// Activating the push notifications transport.
// Do this when running inside a mobile OS, for example.
telepat.connect({
apiEndpoint: 'TELEPAT-API-ENDPOINT',
socketEndpoint: 'TELEPAT-SOCKET-ENDPOINT',
apiKey: 'APP-API-KEY',
appId: 'APP-ID',
persistentConnection: {
type: 'ios',
token: 'DEVICE-NOTIFICATION-TOKEN',
active: 1
}
});
Call this function to disconnect the client from the Telepat backend.
Forwards messages reveived via external channels to the processing unit. Use this if you've configured external transports (like push notifications), and you need to pass received payloads to the processing engine.
(string)
The delta update notification received from Telepat
Call this function to add callbacks to be invoked on event triggers. Available callbacks:
| Name | Description |
|---|---|
| connect | Invoked when client has connected to the backend |
| disconnect | Invoked when client has disconnected from the backend |
| configure | Invoked when client configuration has completed |
| error | Invoked on any operation error |
| collections-update | Invoked when the available collections have updated |
| login | Invoked when client has successfully logged in |
| login-error | Invoked when there was an error with logging in |
| logout | Invoked when client has successfully logged out |
| logout-error | Invoked when there was an error with logging out |
(string)
The name of the event to associate the callback with
(function)
The callback to be executed
number
:
A callback id. Save this in order to later remove the callback from the event (using
removeCallback
)
telepat.on('connect', () => {
console.log('connected');
});
Call this function to remove callbacks that have been set using on.
(string)
The name of the event the callback was associated with
(any)
let connectCallbackId = telepat.on('connect', () => {
// Remove the callback after the first connection event
telepat.removeCallback(connectCallbackId);
});
Use this function to create a new Channel object and retrieve its objects.
(Object)
The object describing the required subscription
| Name | Description |
|---|---|
options.limit [number]
|
The maximum number of objects to be returned in this batch (for pagination) |
options.channel [Object]
|
Describes the basic properties of the objects requested |
options.sort [Object]
|
An object that defines how returned objects should be sorted. Each object key is a property name, and each value can be either
asc
or
desc
.
|
options.filters [Object]
|
An object describing how returned objects should be filtered. |
options.offset [number]
|
The offset that should be applied for the returned objects (for pagination) |
(function)
Callback invoked when subscription is ready
Channel
:
The new
Channel
object
// A simple subscription to all objects of type `article`
// in a specific collection
let articleChannel = telepat.subscribe({
channel: {
context: 'context-unique-identifier',
model: 'article'
}
}, () => {
console.log(articleChannel.objectsArray);
});
// A filtered subscription to all objects of type `article`
// in a specific collection, that have one of two specific tag values
let articleChannel = telepat.subscribe({
channel: {
context: 'context-unique-identifier',
model: 'article'
},
filters: {
or: [
{
is: {
tag: 'specific-tag-value'
}
},
{
is: {
tag: 'another-tag-value'
}
}
]
}
}, () => {
console.log(articleChannel.objectsArray);
});
// A simple subscription to all objects of type `article`
// in a specific collection, sorted by created date descending
let articleChannel = telepat.subscribe({
channel: {
context: 'context-unique-identifier',
model: 'article'
},
sort: {
created: 'desc'
}
}, () => {
console.log(articleChannel.objectsArray);
});
// A simple subscription to all objects of type `comment`
// in a specific collection, that belong to a specific article parent
let articleChannel = telepat.subscribe({
channel: {
context: 'context-unique-identifier',
model: 'comment',
parent: {
model: 'article',
id: 'article-parent-unique-identifier'
}
}
}, () => {
console.log(articleChannel.objectsArray);
});
Invoked when client configuration has completed.
(any)
(any)
Invoked when client has connected to the backend.
(any)
(any)
Invoked when client has disconnected from the backend.
(any)
(any)
Invoked when there was an error with logging in.
(any)
(any)
Invoked on any operation error.
(any)
(any)
Invoked when there was an error with logging out.
(any)
(any)
Invoked when client has successfully logged out.
(any)
(any)
Invoked when the available collections have updated.
(any)
(any)
Invoked when client has successfully logged in.
(any)
(any)
Use Channels to create, update and remove Telepat objects. You can create new Channels using the subscribe or the getChannel methods of the main Telepat object.
let articleChannel = telepat.subscribe({
channel: {
context: 'context-unique-identifier',
model: 'article'
}
}, () => {
console.log(articleChannel.objectsArray);
// Create a new article object
articleChannel.objects['new'] = {
title: 'New article',
text: 'Article body'
};
// Update a specific article
articleChannel.objects['article-unique-id'].title = 'New title';
// Delete a specific article
delete articleChannel.objects['article-unique-id'];
// React to object updates
articleChannel.on('update', (operationType, objectId, object, oldObject) => {
console.log(`Received article update of type ${operationType}, for object with id ${objectId}`);
// Objects are already updated
console.log(articleChannel.objects);
});
// Unsubscribe and clear objects
articleChannel.unsubscribe();
});
A container object referencing all of the objects retrieved via subscription. Each object is stored on a key equal to its own unique id.
A container array referencing all of the objects retrieved via subscription. The order of the objects reflects the sorting options set for the channel.
The current object count.
Call this function to perform the actual subscribe for the configured channel. This is usually invoked by the subscribe method on the main Telepat object.
([TelepatCallback](default () => {}))
Callback invoked after subscribe is finished
Call this function to unsubscribe from the configured channel. All channel properties will be reset to original values.
([TelepatCallback](default () => {}))
Callback invoked after unsubscribe is finished
Call this to retrieve the number of objects available for this channel. Value will be available on the objectsCount property.
([TelepatCallback](default () => {}))
Callback invoked after getting object count is finished
Add a new Telepat object to the current channel. Instead of using this function, you can also add the object to Channel.objects, on any new key. The key will be automatically replaced with the new object id after the backend processes the operation.
(Object)
The new object to add
([TelepatCallback](default () => {}))
Callback invoked after notifying the Telepat backend of the new object
// This is one way of adding a new object using the channel instance.
// The new key will be picked up by the monitoring system, which will signal the new event creation
// to the Telepat backend, and then delete the new key you just set from the objects property.
// After processing the request, Telepat will signal the change back to the client, and the new object will be
// re-added to the objects property, but this time on the right key (equal to the new object's assigned id).
// This is when the 'update' event will get triggered on the channel.
channel.objects['new'] = newObject;
// Alternatively, you can call the add method:
channel.add(newObject, err => {
if (err) {
// There's been a server error, check err. The object will not be added.
} else {
// We've successfully signaled that we want to add the object.
// Keep in mind that this is not a sync process, so we still have to wait for the 'update'
// event on the channel, signaling the availability of the new object on the channel.objects property.
}
});
Remove a Telepat object from the current channel. Instead of using this function, you can also delete the object from Channel.objects.
(string)
The id of the object to delete
([TelepatCallback](default () => {}))
Callback invoked after notifying the Telepat backend of the deleted object
// This is one way of deleting an object using the channel instance.
// The deleted key will be picked up by the monitoring system, which will signal the object removal
// to the Telepat backend. The change will be then signaled back to the client as confirmation, triggering
// the channel's 'update' event.
// This is the optimistic way of doing a delete, as the removed object will be instantly gone from the local
// state, before the 'update' event is triggered (and even if it is not).
delete channel.objects[objectId];
// Alternatively, the pessimistic approach is to call the remove method:
channel.remove(objectId, err => {
if (err) {
// There's been a server error, check err. The object will not be deleted.
} else {
// We've successfully signaled that we want to delete the object.
// Keep in mind that this is not a sync process, so we still have to wait for the 'update'
// event on the channel, signaling that the object has been removed from the channel.objects property.
}
});
Updates a Telepat object from the current channel. To call this function, you need to create an array containing 'patch' objects, representing the modifications that need to be persisted. The structure of a patch object is:
{'op': 'replace', 'path': channel + '/' + object_id + '/' + object_property, 'value': modified_value}
Instead of using this function, you can also update the object directly from Channel.objects.
(number)
The id of the object to update
([TelepatCallback](default () => {}))
Callback invoked after notifying the Telepat backend of the updated object
// This is one way of updating an object using the channel instance.
// The updated key will be picked up by the monitoring system, which will signal the object update
// to the Telepat backend. The change will be then signaled back to the client as confirmation, triggering
// the channel's 'update' event.
// This is the optimistic way of doing a delete, as the updated object will be instantly modified within the local
// state, before the 'update' event is triggered (and even if it is not).
channel.objects[objectId].title = "New title";
// Alternatively, the pessimistic approach is to call the update method:
channel.update(objectId, [
{
'op': 'replace',
'path': `article/${objectId}/title`,
'value': 'New title'
}
], err => {
if (err) {
// There's been a server error, check err. The object will not be updated.
} else {
// We've successfully signaled that we want to update the object.
// Keep in mind that this is not a sync process, so we still have to wait for the 'update'
// event on the channel, signaling that the object has been updated within the channel.objects property.
}
});
Call this function to add callbacks to be invoked on event triggers. Available callbacks:
| Name | Description |
|---|---|
| error | Invoked when there was an error processing the requested operation |
| subscribe | Invoked when channel subscription is successful |
| unsubscribe | Invoked when channel unsubscription is successful |
| update | Invoked when objects in the subscription have been modified (update of an existing object, new object or deleted object) |
(string)
The name of the event to associate the callback with
(function)
The callback to be executed
number
:
A callback id. Save this in order to later remove the callback from the event (using
removeCallback
)
// React to object updates
articleChannel.on('update', (operationType, objectId, object, oldObject) => {
console.log(`Received article update of type ${operationType}, for object with id ${objectId}`);
// Objects are already updated
console.log(articleChannel.objects);
});
Call this function to remove callbacks that have been set using on.
(string)
The name of the event the callback was associated with
(any)
let updateCallbackId = channel.on('update', () => {
// Remove the callback after the first update event
channel.removeCallback(updateCallbackId);
});
Invoked when channel subscription is successful.
(any)
(any)
Invoked when channel unsubscription is successful.
(any)
(any)
Invoked when objects in the subscription have been modified (there was an update of an existing object, a new object has been added or an object has been deleted).
Invoked when there was an error processing the requested operation.
(any)
(any)
You can access an instance of this class using the user property of the Telepat object.
telepat.user.login('email', 'password', (err) => {
if (err) {
// Treat login error
} else {
// Treat successful login
console.log(telepat.user.data);
// Update user data
telepat.user.data.points++;
}
});
Indicates if the currently logged in user is an admin
Indicates if there's a saved authentication token that can be used to re-login
Object that holds all key-value data about the currently logged in user
If there is a saved authentication token from previous connections, try to use it to login again. You can call this method if the canReauth property is true.
([TelepatCallback](default () => {}))
Callback invoked after reauth operation is finished
Call this to update your profile.
To call this method, you need to create an array containing 'patch' objects, representing the modifications that need to be persisted. The structure of a patch object is:
{'op': 'replace', 'path': user or admin + '/' + user_id + '/' + property, 'value': modified_value}
Instead of using this function, you can also update the user directly from User.data.
(string)
The user id of the updated user profile
([TelepatCallback](default () => {}))
Callback invoked after operation is finished
Call this to request a password reset for the logged in user. The process involves a confirmation email, with a link that needs to be clicked on in order to get a unique pass reset token. You then use that token to call the resetPassword method that finishes the process by setting a new password.
(string)
The email/username of the user to reset the pass for
([string](default null))
The URL the user will be pointed to after verifying the request by clicking the link in the sent email
([TelepatCallback](default () => {}))
Callback invoked after the operation is finished
(string)
The id of the user that needs the password reset
(any)
(string)
The new password
([TelepatCallback](default () => {}))
Callback invoked after the operation is finished
This function creates a new user profile.
(Object)
The object representing the new user profile
([TelepatCallback](default () => {}))
Callback invoked after the operation is finished
This function creates a new admin profile.
(Object)
The object representing the new admin profile
([TelepatCallback](default () => {}))
Callback invoked after the operation is finished
This function associates the current anonymous device to a Telepat user profile, using a Facebook account for authentication.
(string)
The user token obtained from Facebook after login
([TelepatCallback](default () => {}))
Callback invoked after the operation is finished
This function associates the current anonymous device to a Telepat user profile, using a password for authentication.
(string)
The user's email address
(string)
The user's password
([TelepatCallback](default () => {}))
Callback invoked after the operation is finished
telepat.user.login('email', 'password', (err) => {
if (err) {
// Treat login error
} else {
// Treat successful login
console.log(telepat.user.data);
}
});
This function associates the current anonymous device to a Telepat administrator profile, using a password for authentication.
(string)
The admin email address
(string)
The admin password
([TelepatCallback](default () => {}))
Callback invoked after the operation is finished
<EMAIL_ADDRESS>'password', (err) => {
if (err) {
// Treat login error
} else {
telepat.admin.getAppUsers((err) => {
if (err) {
// Treat error
} else {
// Treat success
console.log(telepat.admin.users);
}
})
}
});
Call this to retrieve a specific application user object. Results will be sent as a callback argument.
(string)
The id of the requested user
([TelepatCallback](default () => {}))
Callback invoked after operation is finished
This function retrieves the currently logged in user's information.
([TelepatCallback](default () => {}))
Callback invoked after the operation is finished
Logs the current user out.
([TelepatCallback](default () => {}))
Callback invoked after the operation is finished
You can access an instance of this class using the admin property of the Telepat object. This instance becomes available after successfully logging in as an administrator.
<EMAIL_ADDRESS>'password', (err) => {
if (err) {
// Treat login error
} else {
telepat.admin.getAppUsers((err) => {
if (err) {
// Treat error
} else {
// Treat success
console.log(telepat.admin.users);
// Update users
telepat.admin.users[goodUserId].isAwesome = true;
delete telepat.admin.users[badUserId];
// Update collection metadata
telepat.collections[currentCollectionId].topic = 'Cats';
}
})
}
});
This Channel instance allows registering callbacks for 'update' events on user data.
This object contains data about all of the applications the current administrator can access. Each app data is stored using a key equal to the application unique identifier. You can access this after calling getApps. Modifications to app objects stored within will be automatically synchronized with the Telepat backend.
This object contains data about the currently connected app. You can access this after calling getApps. Modifications to this object will be automatically synchronized with the Telepat backend.
This object contains data about all of the users of the current app. Each user data is stored using a key equal to the user unique identifier. You can access this after calling getAppUsers. Modifications to user objects stored within will be automatically synchronized with the Telepat backend.
Call this to retrieve all the application objects the current administrator can access. Results will be sent as a callback argument, and persisted on the apps property. The object belonging to the currently connected app will also be made available, on the app property.
([TelepatCallback](default function () {}))
Callback invoked after operation is finished
Call this to create a new application.
(Object)
Data about the new application. Can hold any key-value data.
Must contain at least a 'keys' key, with an array of string values that will be used as valid API keys for the app.
([TelepatCallback](default function () {}))
Callback invoked after operation is finished
Updates key-value data within an application object.
To call this method, you need to create an array containing 'patch' objects, representing the modifications that need to be persisted. The structure of a patch object is:
{'op': 'replace', 'path': application + '/' + app_id + '/' + property, 'value': modified_value}
Instead of using this function, you can also update the app directly from Admin.apps.
(string)
The application id
([TelepatCallback](default () => {}))
Callback invoked after operation is finished
Call this to delete an application. Instead of using this function, you can also delete the app directly from Admin.apps.
(string)
The application id
([TelepatCallback](default function () {}))
Callback invoked after operation is finished
Call this to create a new collection.
(Object)
Data about the new application. Can hold any key-value data. May be empty object.
([TelepatCallback](default () => {}))
Callback invoked after operation is finished
Updates key-value data within a collection object.
To call this method, you need to create an array containing 'patch' objects, representing the modifications that need to be persisted. The structure of a patch object is:
{'op': 'replace', 'path': context + '/' + collection_id + '/' + property, 'value': modified_value}
Instead of using this function, you can also update the collection directly from Telepat.collections.
(string)
The collection id
([TelepatCallback](default () => {}))
Callback invoked after operation is finished
Call this to delete a collection. Instead of using this function, you can also delete the collection directly from Telepat.collections.
(string)
The collection id
([TelepatCallback](default () => {}))
Callback invoked after operation is finished
Call this to remove a model from the schema, together with all objects of that specific type.
(string)
The model name
(TelepatCallback)
Callback invoked after operation is finished
Call this to retrieve all the current application user objects. Results will be sent as a callback argument, and persisted on the users property.
([TelepatCallback](default function () {}))
Callback invoked after operation is finished
This is an alias for #User#register.
(Object)
The object representing the new user profile
([TelepatCallback](default function () {}))
Callback invoked after operation is finished
Call this to delete a user profile. Instead of using this function, you can also delete the user directly from Admin.users.
(string)
The email address of the user profile to delete
([TelepatCallback](default function () {}))
Callback invoked after operation is finished
Call this to update a user profile.
To call this method, you need to create an array containing 'patch' objects, representing the modifications that need to be persisted. The structure of a patch object is:
{'op': 'replace', 'path': user + '/' + user_id + '/' + property, 'value': modified_value}
Instead of using this function, you can also update the user directly from Admin.users.
(string)
The id of the user to be updated
([TelepatCallback](default function () {}))
Callback invoked after operation is finished
Call this to authorize access to the current app for another administrator account within the same Telepat instance.
(string)
The email associated with the account of the new administrator
(TelepatCallback)
Callback invoked after operation is finished
Call this to deauthorize access to the current app for another administrator account within the same Telepat instance.
(string)
The email associated with the account of the administrator to be removed
(TelepatCallback)
Callback invoked after operation is finished
This callback is displayed as part of the Requester class.
(Error)
If there was an error processing the requested operation, this will reference the error object resulted
(any)
The operation response


Yep, we are making flappy bird! Press the spacebar to flap and try to navigate through the gaps in the pipes!
1) Delete the cat and add a character that has wings (and can flap). Add a cool backdrop.
2) On flag click, your sprite should start in the center of the screen and slowly fall. If it reaches the bottom of the screen, your character should say, "Game Over."
3) When space is pressed, make your sprite flap its wings and fly. (Can you make the flapping look natural? Think about how birds actually flap their wings.)
4) When you click the spacebar twice quickly in a row, does your sprite go up once or twice? If it only goes up once, make sure it goes up twice.
5) Draw pipes. Can you make them look round? Tip: vector mode might be easier for this and try making both pipes in one sprite. Also, make sure your sprite can fit between them comfortably.
6) Make the pipes move.
7) Add a score that goes up every time your sprite passes the pipes
8) Create multiple pipes (hint: try using clones!)
9) End the game whenever the sprite touches a pipe. (Tip: stop(all) doesn’t work well for this. Can you figure it out with stop(other scripts in this sprite)?
10) Make the pipes randomly have the opening higher or lower. (Tip: set the size of the pipes to 200% so that they always fill the screen.)


| < Day Day Up > |
Data Modification GuidelinesAll of the guidelines thus far in this chapter have explored ways to make retrieving data more efficient. But data also must be modified, and you need to ensure that data modification is performed efficiently, too. Under normal circumstances, you can modify data in a DB2 table in six ways:
This section provides tips for the efficient implementation of the first three methods. You can find guidelines for the others as follows:
Limit Updating Indexed ColumnsWhen you update columns in indexes, a corresponding update is applied to all indexes in which the columns participate. Updating can have a substantial impact on performance due to the additional I/O overhead. Use FOR UPDATE OF CorrectlySpecify only those columns that actually will or can be updated in the FOR UPDATE OF column list of a cursor. DB2 does not use any index that contains columns listed in the FOR UPDATE OF clause. Consider Using DELETE/INSERT Instead of FOR UPDATE OFIf all columns in a row are being updated, use DELETE on the old row and use INSERT on the new one rather than the FOR UPDATE OF clause. Update Multiple RowsYou have two options for updating data using the SQL UPDATE verb:
If the data does not have to be retrieved by the application before the update, use the direct SQL UPDATE statement. A cursor UPDATE with the WHERE CURRENT OF option performs worse than a direct UPDATE for two reasons. First, the rows to be updated must be retrieved from the cursor a row at a time. Each row is fetched and then updated. A direct UPDATE affects multiple rows with one statement. Second, when using a cursor, you must add the overhead of the OPEN and CLOSE statement. Update Only Changed ColumnsUPDATE statements should specify only columns in which the value will be modified. For example, if only the ACSTAFF column of the DSN8810.PROJACT table should be changed, do not code the following: EXEC SQL FETCH C1 INTO :HV-PROJNO, :HV-ACTNO, :HV-ACSTAFF, :HV-ACSTDATE, :HV-ACENDATE END-EXEC. MOVE 4.5 TO HV-ACSTAFF. UPDATE DSN8810.PROJACT SET PROJNO = :HV-PROJNO, ACTNO = :HV-ACTNO, ACSTAFF = :HV-ACSTAFF, ACSTDATE = :HV-ACSTDATE, ACENDATE = :HV-ACENDATE WHERE CURRENT OF C1; Although the host variables contain the same data currently stored in the table, you should avoid this type of coding. DB2 checks to see whether the data is different before performing the update. If none of the values are different from those already stored in the table, the update does not take place. Performance may suffer, though, because DB2 has to perform the value checking. You can avoid this situation by coding the UPDATE statement as follows: UPDATE DSN8810.PROJACT SET ACSTAFF = :HV-ACSTAFF WHERE CURRENT OF C1; Disregard this guideline when the application you are developing requires you to code a complicated check algorithm that DB2 can perform automatically. Because of the complexity of the code needed to check for current values, implementing this type of processing is not always feasible. Nevertheless, try to avoid specifying useless updates of this type when issuing interactive SQL. Consider Dropping Indexes Before Large InsertionsWhen you execute a large number of INSERTs for a single table, every index must be updated with the columns and the appropriate RIDs (record IDs) for each inserted row. For very large insertions, the indexes can become disorganized, causing poor performance. Dropping all indexes for the table, performing the INSERTs, and then re-creating the indexes might be more efficient. The trade-offs to consider are
Exercise Caution When Issuing Ad Hoc DELETE StatementsBe extremely careful when issuing SQL DELETE statements outside the control of an application program. Remember that SQL acts on a set of data, not just one row. All rows that qualify based on the SQL WHERE clause are updated or deleted. For example, consider the following SQL statement: DELETE FROM DSN8810.DEPT; This SQL statement, called a mass DELETE, effectively deletes every row from the DEPT table. Normally, this result is undesirable. Exercise Caution When Issuing Ad Hoc UPDATE StatementsWhen issuing an ad hoc UPDATE, take care to specify an appropriate WHERE clause. Consider the following SQL statement: UPDATE DSN8810.DEPT SET DEPTNAME = 'NEW DEPARTMENT'; This SQL statement changes the value of the DEPTNAME column for every row in the table to the value 'NEW DEPARTMENT'. This result occurs because no WHERE clause is coded to limit the scope of the UPDATE. Requests of this nature are not usually desirable and should be avoided. Mass DELETE Versus LOADSometimes you need to empty a table. You can do so by issuing a mass DELETE or by loading an empty data set. A mass DELETE usually is more efficient when you're using segmented table spaces. Loading an empty data set usually is more efficient when you're using simple or partitioned table spaces.
With DB2 Version 7 comes the ability to code a self-referencing sub-SELECT on searched UPDATE and DELETE statements. In previous releases of DB2, the WHERE clause cannot refer to the table (or view) being modified by the statement. For example, the following SQL is legitimate as of DB2 V7, and can be used to implement a 10% raise for employees who earn less than their department's average salary: UPDATE DSN8710.EMP E1 SET SALARY = SALARY * 1.10 WHERE SALARY < (SELECT AVG(SALARY) FROM DSN8710.EMP E2 WHERE E1.WORKDEPT = E2.WORKDEPT); DB2 will evaluate the complete subquery before performing the requested UPDATE. Use INSERT and UPDATE to Add Long ColumnsThe maximum length of a string literal that can be inserted into DB2 is 255 characters. This restriction poses a problem when you must insert a LONG VARCHAR column in an ad hoc environment. To get around this limitation, issue an INSERT followed immediately by an UPDATE. For example, if you need to insert 260 bytes of data into a LONG VARCHAR column, begin by inserting the first 255 bytes as shown: INSERT INTO your.table COLUMNS (LONG_COL, other columns) VALUES (' first 255 bytes of LONG_COL ', other values); Follow the INSERT with an UPDATE statement to add the rest of the data to the column, as in the following example: UPDATE your.table SET LONG_COL = LONG_COL || ' remaining 5 bytes of LONG_COL ', WHERE KEY_COL = 'key value'; For this technique to be successful, a unique key column (or columns) must exist for the table. If each row cannot be uniquely identified, the UPDATE cannot be issued because it might update more data than you want. CAUTION Prior to DB2 V6 (and DB2 V5 with a retrofit APAR) the maximum length of a string literal that could be inserted into DB2 was limited to 254 characters, instead of 255.
The ability to code a self-referencing sub-SELECT on searched UPDATE and DELETE statements was added to DB2 Version 7. In previous releases of DB2, the WHERE clause cannot refer to the table (or view) being modified by the statement. For example, the following SQL is legitimate as of DB2 V7, and can be used to implement a 10% raise for employees who earn less than their department's average salary: UPDATE DSN8810.EMP E1 SET SALARY = SALARY * 1.10 WHERE SALARY < (SELECT AVG(SALARY) FROM DSN8810.EMP E2 WHERE E1.WORKDEPT = E2.WORKDEPT); DB2 will evaluate the complete subquery before performing the requested UPDATE.
DB2 Version 8 offers the intriguing new ability to SELECT from an INSERT statement. To understand why we might need to do so, let's first review some background data. In some cases, it is possible to perform actions that generate new data for an inserted row before it gets saved to disk. For example, a BEFORE TRIGGER might change data before it is even recorded to disk, but the application program will not have any knowledge of this change that is made in the trigger. Using general registers, identity columns, and user-defined defaults can produce similar effects. What can be done if the program needs to know the final column values? Prior to DB2 V8, this is difficult and inefficient to implement. For example, to retrieve that last identity column value, a separate singleton SELECT statement is needed to retrieve the result of IDENTITY_VAL_LOCAL() into a host variable. The SELECT FROM INSERT syntax solves this problem. It allows you to both insert the row and retrieve the values of the columns with a single SQL statement. It performs very well, because it performs both the INSERT and the SELECT as a single operation. Consider the following example: SELECT PRSTDATE FROM INSERT (PROJNO, DEPTNO, RESPEMP, PRSTDATE) INTO DSN8810.PROJ VALUES('000001', 'B01', '000020', CURRENT DATE); The data is inserted as specified in the VALUES clause, and then retrieved as specified in the SELECT. Without the ability to select PRSTDATE, the program would have no knowledge of the value supplied to PRSTDATE, because it was assigned using CURRENT DATE. Instead, the program would have had to issue a separate SELECT statement to retrieve the actual date. With this new syntax, the program can retrieve the CURRENT DATE value that was just inserted into PRSTDATE without adding overhead. List Columns for INSERTWhen you are coding an INSERT statement in an application program, list the column names for each value you are inserting. Although you could merely align the values in the same order as the column names in the table, doing so leads only to confusion. Furthermore, if ALTER is used to add new columns to the table, every INSERT statement that does not explicitly list the columns being inserted will fail. The proper format is INSERT INTO DSN8810.DEPT (DEPTNO, DEPTNAME, MGRNO, ADMRDEPT) VALUES ('077', 'NEW DEPARTMENT', '123456', '123') ;
When you need to INSERT multiple rows, consider deploying a multi-row INSERT to place more than one row at a time into the table. This capability is new as of DB2 Version 8. By inserting multiple rows at once, your request may become more efficient. More information on multi-row INSERTs is provided in Chapter 11. |
| < Day Day Up > |


Welcome to
XPUSH Dashboard
On
CPU Stats
Memory Stats
TPS View
Site Ranking : Active Users
Click button to view
0
0


Tesseract Explorer
Oh no! This browser doesn't support WebGL 2! You can read about the tesseract here, but you'll need the latest version of Chrome, Firefox or Edge on desktop or Android to use the Explorer!
Welcome to the 4th dimension! The controls on the right will manipulate the tesseract in 4D space, and you can explore its 3D projection by clicking and dragging with your mouse. To get you started, a favorite view of mine is cutout rendering, orthographic projection, and 45 degree rotations in the XW, YW, and ZW planes.
Show Details
A
tesseract is also known as a hypercube or 8-cell. It is the 4D analog to the 2D square and the 3D cube. Its 3D "surface" is composed of 8 cubes, which enclose a 4D hypervolume. What is rendered here is not the actual tesseract, but its projection into 3D space in a process similar to photographing a 3D world onto 2D camera film.
More information on 4D projections and descriptions of the available controls are provided in the
documentation.


interface MessageRecipients
The interface for a group of message recipients (which may contain only one recipient)
AllPossibleRecipients |
A special base class for the set of all possible recipients, without having to identify who they all are. interface AllPossibleRecipients : MessageRecipients |
MessageRecipientGroup |
A base class for a set of recipients specifically identified by the sender. interface MessageRecipientGroup : MessageRecipients |
SingleMessageRecipient |
A base class for the case of point-to-point messages interface SingleMessageRecipient : MessageRecipients |


Cradle is a simple micro framework built on the latest PHP 7. Its main feature is simplicity, designed for collaborating with other technologies in your stack. Most PHP frameworks are built with a lot in mind, making developing complex PHP centric apps much easier, assuming that PHP is the center of everyone's world.
Modern applications these days, however usually do not rely on the LAMP/LEMP stack alone. They use services for caching, indexing, file storage, push messages, queuing, streams etc. They also use several different languages like Python, Java, Node JS, R, Scala for all kinds of things. A good portion of apps center around client side with React, Angular and mobile devices. With the learning curve, configuration and extra weight that comes with a full stack PHP framework, it's very impractical to use them for simple jobs.
Cradle does not require any particular data store or template engine. There is no defined file structure, no required dependencies and is not specific to building web applications. There are no required dependencies, it does not require you to write classes and features are minimized to manage overhead.
To help explain this simple approach in summary, the following briefly describes the core features of Cradle.
A further tl;dr can be expressed by installing the Kitchen Sink
Events can be formed like the following example where create-user
and
$data
are arbitrary.
cradle()->on('create-user', function(...$data) {
//insert to database
});
Triggering events can be achieved with the following example where 'create-user'
is the name of the event to execute, foo
and bar
will be passed to $data
from the example above.
cradle()->trigger('create-user', 'foo', 'bar');
Events can also be called from the command line like the following example.
$ vendor/bin/cradle update-user name="John Doe" --age 45
The following code could receive and process this command where $req
is
a Cradle\Http\Request
object and $res
is a Cradle\Http\Response
object.
cradle()->on('update-user', function($req, $res) {
$name = $req->getStage('name');
$age = $req->getStage('age');
$res->setContent('Hello, ' . $name);
});
More information in depth can be found here.
Request objects are used whenever a consumers uses your application via command line or http request. Request objects provide many useful methods like the following.
$req->getPost('foo');
$req->getServer('REQUEST_URI');
$req->getCookies('name');
$req->getSession('name');
$req->getFiles();
Request, can be accessed like an array because it implements ArrayAccess and when outputted will output as a JSON hash will look like the following.
{
"args": null,
"body": "",
"cookie": {},
"files": {},
"get": {
"baz": "zoo"
},
"post": {
"foo": "bar"
},
"stage": {
"baz": "zoo",
"foo": "bar"
},
"session": {},
"server": {
"HTTP_HOST": "cradle.dev",
"REQUEST_METHOD": "POST",
"REQUEST_URI": "\/docs\/introduction.html?baz=zoo",
...
},
"path": {
"string": "\/docs\/introduction.html",
"array": [
"",
"docs",
"introduction.html"
]
},
"method": "POST",
"query": "baz=zoo",
"route": {
"method": "post",
"path": "\/docs\/*",
"variables": [
"introduction.html"
]
}
}
Request comes with aggregated data from the post
, get
and url variables
found in stage
. To access stage data you can use $req->getStage('foo')
to
get the value of foo
or get the entire staged data with $req->getStage()
.
Manipulating the stage likewise can be done like this $req->setStage('foo', 'bar')
.
In practice we manipulate stage data in preparation of a write process like
inserting into a database.
More information about requests in depth can be found here.
Response objects are used as a format for parsing data to be returned back to a consumer via command line or HTTP. Response objects have similar traits to Request and likewise provide many useful methods like the following.
$res->getResults(...$args);
$res->setResults(...$args, $value);
$res->setError(true, $message);
$res->addHeader('Content-Type', 'text/plain');
$res->setContent('Hello, World');
Response, can be accessed like an array because it implements ArrayAccess and when outputted will output as a JSON hash will look like the following.
{
"headers": {
"Content-Type": "text\/plain"
},
"code": 200,
"header": {
"Status": "200 OK",
},
"json": {
"error": false,
"results": {
"menu": {
"#registry": "Registry",
"#methods": "Response Methods",
}
}
},
"content": "Hello, World"
}
When there is no content set in your response by default the JSON data is
outputted. Otherwise, we use results
found in json
for binding with
template engines.
More information about responses in depth can be found here.
Routes can be formed like the following example where /create/user
is arbitrary.
cradle()->get('/create/user', function($req, $res) {
//show a form
});
cradle()->post('/create/user', function($req, $res) {
//insert into database
});
As well as get
and post
in the above example there are three more ease of use
methods called put
, delete
and all
. Custom methods can be dealt with in this
manner.
cradle()->route('OPTIONS', '/create/user', function($req, $res) {
//Allow CORS
});
To enable routes you simply call cradle()->render()
after all your route
definitions. More information about routing in depth can be found
here.
cradle()->render()
actually does four steps.
Pre-processors and post-processors can be defined in the following manner.
cradle()->preprocess(function ($req, $res) {
//do something before routing
});
cradle()->postprocess(function ($req, $res) {
//do something after routing
});
Post-processors when going through the normal render
method, are executed
after the response has been sent out to the user and the connection is closed.
The only caveat to post-processors is that sessions as in $_SESSION
can no
longer be written to.
Pre-processors can be executed exclusively by using the following code
cradle()->prepare()
. Likewise post-processors can be called like this
cradle()->shutdown()
.
When going through the normal render
method, errors are handled with the
following construct.
cradle()->error(function($req, $res, $err) {
//handle this error
});
The third argument in the above example passes the Throwable $err
object
when it applies. When an error is thrown, the response code would be changed
to either 500 or 404. Errors are also triggered when we did not match a route
to an actual request.
More information about middleware in depth can be found here.


Hazard Stars As Belgium Thrash Russia
by SL InternationalRussia 1-4 Belgium
Belgium, who have already qualified, should Russia no mercy after romping to a 4-1 victory at the Saint-Petersburg Stadium.
Eden Hazard bagged a brace, while Thorgan Hazard and Romelu Lukaku completed the rout for the Red Devils.
Georgi Dzhikiya bagged the consolation for Russia, who have also already qualified for the tournament.
Northern Ireland 0-0 Netherlands
The Netherlands have secured their ticket to next year's tournament, despite playing to a goalless draw at Northern Ireland.
Germany's win over Belarus means the Dutch have dropped to second spot in Group C.
Azerbaijan 0-2 Wales
Wales kept their EURO 2020 hopes alive with a 2-0 victory away to Azerbaijan on Saturday evening.
Kieffer Moore opened the scoring after 10 minutes, before Harry Wilson got the second goal for Ryan Giggs' charges after 34 minutes.
Wales can qualify automatically if they beat Hungary on Tuesday evening.
Croatia 3-1 Slovakia
Croatia qualified for the European Championship after rallying from behind to defeat Slovakia 3-1 at the Stadion HNK Rijeka.
Nikola Vlasic, Bruno Petkovic and Ivan Perisic netted for Croatia after the visitors had taken a first-half lead through Robert Bozenkik.
Israel 1-2 Poland
Poland cemented top spot in Group G with a 2-1 triumph away to Israel on Saturday night.
With qualification already secured, Grzegorz Krychowiak and Krzysztof Piatek got the goals to secure victroy for the visitors. Munas Dabour got the late consolation for the hosts.
Other results:
Cyprus 1-2 Scotland
Slovenia 1-0 Latvia
San Marino 1-3 Kazakhstan
(Qualified) Austria 2-0 North Macedonia


1// Copyright 2015 Denis Karanja. All rights reserved.
2 // Use of this source code is governed by a MIT-style
3 // license that can be found in the LICENSE file.
4 // Find the code HERE56package deebeat
78import"net/url"910typedefstruct Profile {
11char author = "Denis Karanja";
1213// You can check out my code at these places:14char github;1516// You can stalk me on these places:17char email,twitter,linkedin;18 } open;
19


knitcitations: Citations for 'Knitr' Markdown Files
Provides the ability to create dynamic citations
in which the bibliographic information is pulled from the web rather
than having to be entered into a local database such as 'bibtex' ahead of
time. The package is primarily aimed at authoring in the R 'markdown'
format, and can provide outputs for web-based authoring such as linked
text for inline citations. Cite using a 'DOI', URL, or
'bibtex' file key. See the package URL for details.
Downloads:
Reverse dependencies:
| Reverse imports: |
interAdapt, stpm |
| Reverse suggests: |
blin, DeLorean, fitdistrplus, markovchain, mbbefd, milr, netregR, OSTSC, reports, RNeXML, staRdom, wrswoR, zFactor |
Linking:
Please use the canonical form
https://CRAN.R-project.org/package=knitcitations
to link to this page.


Version 1.3.0 of WebStart has just been released.
Root directories for websites can now be chosen individually, making it easier to organize your files on your hard disk.
The update is available free of charge from the integrated updater.
A full installer is also available to download.
Version 1.3.0 also includes a 14 days trial period.
So just give it a try, I'm sure you won't regret it! Enjoy!


{% extends "layout.nunjucks" %} {% set page_title = "events" %} {% block site_title %}2018 Golf For Hope Charity Golf Tournament | {% endblock %} {% block page_class %}no-promo events{% endblock %} {% block promomtions %}{% endblock %} {% block cta %}{% endblock %} {% block site_content %} Silent Auction Take a sneak peek at some of the items that will be for auction, Monday. Callaway Strata Men's 12 piece set Kurt Warner Autograph LUG Aqua Overnight Bag MauiJim Wiki-wiki Aviator Sunglasses Ring Video Doorbell 2 YETI Roadie 20 Cooler And that's not all... NY Mets tickets IT Cosmetics products Vera Bradley Duffel bag SU Football Tickets Dry Bar gift card Thank you to the generous companies who donated all of these items! It's not too late Register as a golfer or dinner guest to participate in the silent auction and raffles! Register Today {% endblock %} {% block footer_scripts %}{% endblock %}
Take a sneak peek at some of the items that will be for auction, Monday.
Thank you to the generous companies who donated all of these items!
Register as a golfer or dinner guest to participate in the silent auction and raffles!


This test makes sure that navigator.isProtocolHandlerRegistered throws the proper exceptions and returns the default state of handler.


QPdfWriter Class
The QPdfWriter class is a class to generate PDFs that can be used as a paint device. More...
| Header: | #include <QPdfWriter> |
| qmake: | QT += gui |
| Inherits: | QObject and QPagedPaintDevice |
Public Functions
| QPdfWriter(const QString &filename) | |
| QPdfWriter(QIODevice *device) | |
| ~QPdfWriter() | |
| QString | creator() const |
| QPageLayout | pageLayout() const |
| int | resolution() const |
| void | setCreator(const QString &creator) |
| bool | setPageLayout(const QPageLayout &newPageLayout) |
| bool | setPageMargins(const QMarginsF &margins) |
| bool | setPageMargins(const QMarginsF &margins, QPageLayout::Unit units) |
| bool | setPageOrientation(QPageLayout::Orientation orientation) |
| bool | setPageSize(const QPageSize &pageSize) |
| void | setResolution(int resolution) |
| void | setTitle(const QString &title) |
| QString | title() const |
Reimplemented Public Functions
| virtual bool | newPage() override |
(obsolete) virtual void | setMargins(const Margins &m) override |
(obsolete) virtual void | setPageSize(PageSize size) override |
(obsolete) virtual void | setPageSizeMM(const QSizeF &size) override |
- 32 public functions inherited from QObject
- 13 public functions inherited from QPagedPaintDevice
- 14 public functions inherited from QPaintDevice
Reimplemented Protected Functions
| virtual QPaintEngine * | paintEngine() const override |
- 9 protected functions inherited from QObject
- 1 protected function inherited from QPaintDevice
Additional Inherited Members
- 1 property inherited from QObject
- 1 public slot inherited from QObject
- 2 signals inherited from QObject
- 1 public variable inherited from QObject
- 10 static public members inherited from QObject
- 9 protected functions inherited from QObject
- 1 protected function inherited from QPaintDevice
- 2 protected variables inherited from QObject
Detailed Description
The QPdfWriter class is a class to generate PDFs that can be used as a paint device.
QPdfWriter generates PDF out of a series of drawing commands using QPainter. The newPage() method can be used to create several pages.
Member Function Documentation
QPdfWriter::QPdfWriter(const QString &filename)
Constructs a PDF writer that will write the pdf to filename.
QPdfWriter::QPdfWriter(QIODevice *device)
Constructs a PDF writer that will write the pdf to device.
QPdfWriter::~QPdfWriter()
Destroys the pdf writer.
QString QPdfWriter::creator() const
Returns the creator of the document.
See also setCreator().
[override virtual]
bool QPdfWriter::newPage()
Reimplemented from QPagedPaintDevice::newPage().
QPageLayout QPdfWriter::pageLayout() const
Returns the current page layout. Use this method to access the current QPageSize, QPageLayout::Orientation, QMarginsF, fullRect() and paintRect().
Note that you cannot use the setters on the returned object, you must either call the individual QPdfWriter methods or use setPageLayout().
This function was introduced in Qt 5.3.
See also setPageLayout(), setPageSize(), setPageOrientation(), and setPageMargins().
[override virtual protected]
QPaintEngine *QPdfWriter::paintEngine() const
Reimplemented from QPaintDevice::paintEngine().
int QPdfWriter::resolution() const
Returns the resolution of the PDF in DPI.
This function was introduced in Qt 5.3.
See also setResolution().
void QPdfWriter::setCreator(const QString &creator)
Sets the creator of the document to creator.
See also creator().
bool QPdfWriter::setPageLayout(const QPageLayout &newPageLayout)
Sets the PDF page layout to newPageLayout.
You should call this before calling QPainter::begin(), or immediately before calling newPage() to apply the new page layout to a new page. You should not call any painting methods between a call to setPageLayout() and newPage() as the wrong paint metrics may be used.
Returns true if the page layout was successfully set to newPageLayout.
This function was introduced in Qt 5.3.
See also pageLayout().
bool QPdfWriter::setPageMargins(const QMarginsF &margins)
Set the PDF page margins in the current page layout units.
You should call this before calling QPainter::begin(), or immediately before calling newPage() to apply the new margins to a new page. You should not call any painting methods between a call to setPageMargins() and newPage() as the wrong paint metrics may be used.
To get the current page margins use pageLayout().pageMargins().
Returns true if the page margins were successfully set to margins.
This function was introduced in Qt 5.3.
See also pageLayout().
bool QPdfWriter::setPageMargins(const QMarginsF &margins, QPageLayout::Unit units)
Set the PDF page margins defined in the given units.
You should call this before calling QPainter::begin(), or immediately before calling newPage() to apply the new margins to a new page. You should not call any painting methods between a call to setPageMargins() and newPage() as the wrong paint metrics may be used.
To get the current page margins use pageLayout().pageMargins().
Returns true if the page margins were successfully set to margins.
This function was introduced in Qt 5.3.
See also pageLayout().
bool QPdfWriter::setPageOrientation(QPageLayout::Orientation orientation)
Sets the PDF page orientation.
The page orientation is used to define the orientation of the page size when obtaining the page rect.
You should call this before calling QPainter::begin(), or immediately before calling newPage() to apply the new orientation to a new page. You should not call any painting methods between a call to setPageOrientation() and newPage() as the wrong paint metrics may be used.
To get the current QPageLayout::Orientation use pageLayout().pageOrientation().
Returns true if the page orientation was successfully set to orientation.
This function was introduced in Qt 5.3.
See also pageLayout().
bool QPdfWriter::setPageSize(const QPageSize &pageSize)
Sets the PDF page size to pageSize.
To get the current QPageSize use pageLayout().pageSize().
You should call this before calling QPainter::begin(), or immediately before calling newPage() to apply the new page size to a new page. You should not call any painting methods between a call to setPageSize() and newPage() as the wrong paint metrics may be used.
Returns true if the page size was successfully set to pageSize.
This function was introduced in Qt 5.3.
See also pageLayout().
void QPdfWriter::setResolution(int resolution)
Sets the PDF resolution in DPI.
This setting affects the coordinate system as returned by, for example QPainter::viewport().
This function was introduced in Qt 5.3.
See also resolution().
void QPdfWriter::setTitle(const QString &title)
Sets the title of the document being created to title.
See also title().
QString QPdfWriter::title() const
Returns the title of the document.
See also setTitle().