Hi Jeff,
The events are incorrectly marked as read only because of a bug in how we determine the organizer of an event; read-writable permissions are only granted to the organizer as per the Exchange ActiveSync protocol. Karim's working on fixing the bug, it will be rolled out shortly and we'll keep you posted.
With respect to the rrule returned by the API - absolutely; we will change the representation and let you know when that's done too.
With respect to your question about when the timezone would be null for calendars - we're looking into it and will get back to you.
Thanks!
Kavya
Hi Jeff,
We ran the script to back-fix recurring events created in the past (before last Friday) for the following accounts:
<EMAIL_ADDRESS>Please note that as a result, the event and calendar IDs returned by the API will be different for these accounts.
Let us know if any of the recurring events look incorrect, thanks!
Kavya
From: Christine Spang
Sent: Tuesday, May 26, 2015 4:32 PM
To: Jeff Meister
Cc: Kavya Joshi; Jennie Lees; Andrew Lee; Mackenzie Dallas; support; Karim Hamidou
Subject: Re: Esper <-> NilasJeff, that's correct—read-only support for now.
On May 26 2015, at 4:16 pm, Jeff Meister<EMAIL_ADDRESS>wrote:
JeffThanks,BTW, this is read-only support, correct? We shouldn't be attempting to make changes to recurring events through Nylas? (That's OK if so, just want to check and be sure.)Hi Karim,I just ran my tests from the previous email again, and it looks like they're all working correctly now! I see the overrides working too; I tried deleting a single instance of an event and got an EXDATE as expected. I'll hook things up to GCal on our end and let you know if I see any more recurrence issues.
On Tue, May 26, 2015 at 12:49 PM, Karim Hamidou<EMAIL_ADDRESS>wrote:
Hi Andrew, Jeff
Sorry for the delay in getting back to you. We just deployed the changes to production and the code now supports all documented Exchange recurrence rules and event overrides.
We will be running a script today to back-fix recurring events created before last Friday too.
We’ve tested the code extensively but as always, do let us know if you run into problems.
Karim
From: Andrew Lee<EMAIL_ADDRESS>Date: mardi 26 mai 2015 20:24
To: Karim Hamidou<EMAIL_ADDRESS>Christine Spang<EMAIL_ADDRESS>Jeff Meister<EMAIL_ADDRESS>Cc: Kavya Joshi<EMAIL_ADDRESS>support<EMAIL_ADDRESS>Mackenzie Dallas<EMAIL_ADDRESS>Jennie Lees<EMAIL_ADDRESS>Subject: Re: Esper <-> Nilas
Hey Karim, just checking on this. Did you guys release to production?
On Tue, May 19, 2015 at 11:59 AM Karim Hamidou<EMAIL_ADDRESS>wrote:
Hi Andrew + Esper team,
Just a quick heads up: we're currently testing the fixes on our staging system. We're planning to ship them to production by the end of the week.
regards,
Karim
From: Andrew Lee<EMAIL_ADDRESS>Date: lundi 18 mai 2015 19:20
To: Karim Hamidou<EMAIL_ADDRESS>Christine Spang<EMAIL_ADDRESS>Jeff Meister<EMAIL_ADDRESS>Cc: Kavya Joshi<EMAIL_ADDRESS>support<EMAIL_ADDRESS>Mackenzie Dallas<EMAIL_ADDRESS>Jennie Lees<EMAIL_ADDRESS>Subject: Re: Esper <-> Nilas
Thanks for the e-mail Karim! Just let us know when you guys ship to production. -A
On Wed, May 13, 2015 at 12:08 PM Karim Hamidou<EMAIL_ADDRESS>wrote:
Hi Andrew,
Sorry for the delay in getting back to you. I was actually drafting a reply to Jeff.We’ve taken an iterative approach to this, and the recurring event code we shipped to production only supported the basic cases. That’s why Jeff found so many bugs -- sorry for not making this clearer.
However, I’ve been working on an updated version of the code which should support almost every recurrence rule. I also went through all the bugs you reported to make sure the new code fixes them.It’s currently under review, so it should be shipped to prod early next week.
Sorry for the misunderstanding,
regards
ps @Jeff —here’s a short list of what the new code supports:- UNTIL and COUNT rules- events recurring on the nth day of every month (e.g: a meeting occurring on the third wednesday of the month, of the year, etc.)- complex recurrences (e.g: events occurring every three days but only on Wednesday and Fridays, etc.)
HOWEVER —we’re not yet supporting EXRULES. This is coming soon.
From: Andrew Lee<EMAIL_ADDRESS>Date: mercredi 13 mai 2015 20:08
To: Christine Spang<EMAIL_ADDRESS>Jeff Meister<EMAIL_ADDRESS>Cc: Kavya Joshi<EMAIL_ADDRESS>support<EMAIL_ADDRESS>Mackenzie Dallas<EMAIL_ADDRESS>Karim Hamidou<EMAIL_ADDRESS>Jennie Lees<EMAIL_ADDRESS>Subject: Re: Esper <-> Nilas
Hey guys, just checking in and want to make sure we're giving everything you need.
On Fri, May 8, 2015 at 10:16 AM Christine Spang<EMAIL_ADDRESS>wrote:
Thanks for the info, Jeff! Karim's out today, but we'll take a look on Monday.
From: Jeff Meister<EMAIL_ADDRESS>Sent: Thursday, May 7, 2015 9:03 PM
To: Christine Spang
Cc: Andrew Lee; Kavya Joshi; support; Mackenzie Dallas; Karim Hamidou; Jennie Lees
Subject: Re: Esper <-> NilasJeffThank you,In this case, the event never showed up in my Nylas delta sync. Additionally, no events on that calendar have shown up in the delta sync since then, including the ones that worked fine before (even non-recurring events).Expected RRULE:FREQ=MONTHLY;BYDAY=2WERule from Nylas: None, event never syncedPattern: Second Wednesday of every month, no endExpected BYDAY=TU,TH in RRULERule from Nylas: "['RRULE:FREQ=WEEKLY']"Pattern: Every week on Wednesday and Friday, no endThose were all good. Next, I tried some more complicated recurrences:OK, as expectedRule from Nylas: "['RRULE:FREQ=WEEKLY;INTERVAL=2']"Pattern: Every other week, on the same day as the first occurrence, no endOK, as expectedRule from Nylas: "['RRULE:FREQ=WEEKLY']"Pattern: Every week, on the same day as the first occurrence, no endOK, as expectedRule from Nylas: "['RRULE:FREQ=DAILY']"Pattern: Every day, no endHi Christine,I got delayed working on other things, but I finally found time to test this today. I went back to my O365 test accounts, meg@ and<EMAIL_ADDRESS>so I could mess around with the calendars without affecting customers. I started with Meg and tested some cases successfully, creating events with the following recurrence patterns through the Office 365 Web interface:
Pattern: Every day for 4 days
Rule from Nylas: "['RRULE:FREQ=DAILY']"
Expected COUNT=4 or UNTIL in RRULE
Those didn't give the rules I expected based on my reading of RFC 2445, but they're pretty close, so hopefully they are not so difficult to fix. I'm more worried about the next pattern I tried:
I wasn't sure about the source of the problem, so I switched to my other testing account, Stewie, which has three calendars. I was able to reproduce the same pattern: everything works fine, even some basic recurring events, but when I try the every-second-Wednesday pattern, it stops sending me data for that calendar. I repeated the pattern for Stewie's second calendar and got the same result. Finally, on his third calendar, I tried a slight variation (every third Thursday) with the same result.
Since this seems consistent to me, I suspect I've run into a corner case in the recurrence code. Maybe you can see more in your logs? Let me know if I can provide any further info to help debug this.
On Thu, May 7, 2015 at 3:11 PM, Christine Spang<EMAIL_ADDRESS>wrote:
Hi Andrew & co,
Just checking in here. Were you able to successfully test the new recurring event support for Exchange?
regards,
Christine
From: Andrew Lee<EMAIL_ADDRESS>Sent: Sunday, May 3, 2015 5:05 PM
To: Kavya Joshi; Jeff Meister
Cc: support; Mackenzie Dallas; Karim Hamidou; Jennie Lees
Subject: Re: Esper <-> NilasThanks so much for working round the clock on this Kavya + Nylas team! This is a very big milestone for us and we're really excited to finally put this all into action. We'll get back to you as soon as possible.
On Fri, May 1, 2015 at 11:45 AM Kavya Joshi<EMAIL_ADDRESS>wrote:
Hi Jeff,
We just shipped basic support for recurring events for Exchange.
Specifically, we now sync recurring events from the Exchange server and the API returns these events with an additional "recurrence" object that contains the RRULE and EXDATE strings.
For example, a recurring event would be returned as:
{
…
"recurrence": {
"rrule": "['RRULE:FREQ=WEEKLY', 'EXDATE:20150611T210000Z,20150618T210000Z']",
"timezone": null
},
"when": {
"end_time":<PHONE_NUMBER>,
"object": "timespan",
"start_time":<PHONE_NUMBER>
}
}
You can also expand recurring events using:
GET https://api.nylas.com/n/<namespace_id>/events?expand_recurring=true
We don't support updating recurring events via the API yet, we'll be working on it in next week, but we wanted to get this out to you so you can get started!
As always, let us know if you have any questions!
Cheers,
Kavya
From: Jeff Meister<EMAIL_ADDRESS>Sent: Tuesday, April 28, 2015 3:34 PM
To: Jennie Lees
Cc: Andrew Lee; support; Mackenzie Dallas; Karim Hamidou
Subject: Re: Esper <-> NilasJeffThanks,Hi Jennie,Thank you for the update, it all sounds good to me! Having the recurrence info in standard RRULE format would be best for us, since that's what Google Calendar supports too. It would allow us to simply copy that data over to a Google event (unless you know of recurrence features that we may get from Exchange events through Nylas that Google won't support). We may use the expansion feature as well, but I think an RRULE is what we'll want in most cases.
On Tue, Apr 28, 2015 at 11:00 AM, Jennie Lees<EMAIL_ADDRESS>wrote:
Hey Jeff,
I wanted to give you a quick update on recurring events for Exchange while Christine's out.
We're implementing them using the same approach we took for Google Calendar, including converting the Exchange recurrence info into a standard RRULE, which will be accessible on the event object via our API. However, we've found some nuances in the way Exchange treats exceptions to the rule, so we're currently testing that thoroughly and making sure it lines up with our overall handling of events. You'll be able to access all individual instances of a recurring event without having to do the expansion yourselves, and/or get the recurrence info from the parent.
If this doesn't sound like it's going in the right direction for you, let me know!
Jennie
From: Christine Spang
Sent: Friday, April 24, 2015 3:52 PM
To: Jeff Meister
Cc: Andrew Lee; Kavya Joshi; support; Mackenzie Dallas
Subject: Re: Esper <-> NilasGood to hear things are working for you! :)
The "cancelled events" change was indeed intentional—we want the behaviour to match. This was part of some cleanups and bugfixing we did surrounding cancelled events.
We're going to work on implementing read-only Exchange support for recurring events next week. I think your use case is pretty straightforward, but we'll let you know if any questions come up that you folks could help us out with.
I'll be out of town next week but as long as you keep support@ in the loop someone from our side will keep you posted.
cheers,
Christine
From: Jeff Meister<EMAIL_ADDRESS>Sent: Friday, April 24, 2015 3:30 PM
To: Christine Spang
Cc: Andrew Lee; Kavya Joshi; support; Mackenzie Dallas
Subject: Re: Esper <-> NilasJeffThanks again,Let me know when you have some thoughts on recurring events. I'm happy to discuss our use case over the phone if that's better for you.I noticed a difference in my Nylas delta that isn't a bug but I thought was worth pointing out. When I delete an event on the O365 calendar, I used to see a delete in the Nylas delta. But in today's testing, instead of deletes, I saw updates with the status of the event set to "cancelled". This is actually the same behavior as in Google's calendar API, and it's not a problem for us, just wanted to let you know about it and see if it was an intentional change on your end (or maybe O365 changed what they send you).Hi Christine,I reset the account on our end too and started the Nylas syncing again. Everything looks good so far! I haven't seen the duplicate issue today. Since it happened unpredictably before, I'll continue testing with this customer's account as well as others, just to make sure it doesn't come back.
On Thu, Apr 23, 2015 at 2:38 PM, Christine Spang<EMAIL_ADDRESS>wrote:
Hi again,
We just shipped this fix to production and reset the affected account. This particular bug only occurs when the Exchange server encounters a particular condition, which is why it was both different from the earlier issue and doesn't affect all accounts.
Can you confirm that events look good for this account now?
Hold tight on recurring events for Exchange. We're still figuring out our gameplan there.
--Christine
From: Christine Spang
Sent: Wednesday, April 22, 2015 4:17 PM
To: Jeff Meister
Cc: Andrew Lee; Kavya Joshi; support; Mackenzie Dallas
Subject: Re: Esper <-> NilasHi Jeff,
Sorry for the delay here.
We have a fix for this duplicate events issue on our staging environment right now. We're planning to ship it to production tomorrow morning. Will let you know when this is done.
We're figuring out the best gameplan for Exchange recurring events. I'll let you know when we have more details.
--Christine
From: Jeff Meister<EMAIL_ADDRESS>Sent: Monday, April 20, 2015 6:19 PM
To: Christine Spang
Cc: Andrew Lee; Kavya Joshi; support; Mackenzie Dallas
Subject: Re: Esper <-> NilasJeffHi Christine,
Glad you guys are back, hope you had a good retreat!
Thanks,
Regarding recurring events, we can try expanding but I'm not sure if that will work in our case, unless I can make some changes to avoid us syncing these expanded copies back to the Exchange calendar. What would be better is if we could see the recurrence rules on Exchange events. I think we could deal with that being read-only to start with, we just need an RRULE (or something we can translate into one) for our mirrored calendar on Google. I wrote some more details in my April 6 reply to this thread, explaining what we're doing here. Let me know if you have other questions about this.
On Mon, Apr 20, 2015 at 5:48 PM, Christine Spang<EMAIL_ADDRESS>wrote:
Hi Andrew,
We just got back from retreat today and looking into this was on hold last week while we did some longer-term planning.
Karim is going to dive back into resolving the duplicate events issue now. We have a hunch as to what is up and will keep you posted.
To be clear, the recurring events issue is that recurring events expansion isn't supported on Exchange yet?
Thanks a ton for your patience.
--Christine
From: Andrew Lee<EMAIL_ADDRESS>Sent: Monday, April 20, 2015 5:29 PM
To: Kavya Joshi; support
Cc: Jeff Meister; Mackenzie Dallas; Christine Spang
Subject: Re: Esper <-> NilasJust realized that this isn't exactly the last issue, it's this duplicate events issue and the recurring events issue. But once we have those two - we have users chomping at the bit!
Please let us know if there is anything we can help with. -Andrew
On Mon, Apr 20, 2015 at 9:39 AM Andrew Lee<EMAIL_ADDRESS>wrote:
Hey Kavya, any update on this. This is the LAST issue for us and we're really excited to do a launch so please let us know where we are here.
On Tue, Apr 14, 2015 at 9:35 PM Kavya Joshi<EMAIL_ADDRESS>wrote:
Hi Jeff, Andrew
We've identified the cause of the duplicate events - the sync engine usesExchange server-assigned identifiers to identify events that were previously synced versus new events that need to be synced.In the case of the duplicated events, we received the same event with a different server-assigned ID. As a result, the sync engine created a new event object with a different Nilas API event ID.We're currently looking into what causes the Exchange server to return different IDs for the same event so we can implement a fix - we'll keep you posted.
Thanks!Kavya
On Tue, Apr 14, 2015 at 11:30 AM, Andrew Lee<EMAIL_ADDRESS>wrote:
Hope you guys had a great retreat! Just wanted to check up on the status of this. Happy to jump on a call too! -Andrew
On Tue, Apr 7, 2015 at 4:44 PM Jeff Meister<EMAIL_ADDRESS>wrote:
Hi again,In testing today with a real customer's calendar, I ran into the duplicate events issue again. Not all events are affected, but a significant amount of them are. I'm not sure what, if anything, they all have in common... maybe they were modified at some point after their creation on the Exchange side?
In more detail: I noticed this when doing an initial copy of events from Nilas for this user. At this stage, we aren't using the delta sync API; we start out by making a request for the next 10 weeks' worth of events on the chosen calendar. This request returned 69 events, and I noticed that some were very similar, so I ran a little script that checked for pairs of events that are identical except for their event ID. It found 16 such pairs.
Since I hadn't yet hooked up the code to write changes on our end back to Nilas for this user, and I don't see any of these duplicates on his actual Exchange calendar, I suspect a Nilas issue... in the past you fixed a similar bug in the delta sync caused by changing IDs in Exchange, maybe that's where the problem is?
The Nilas namespace ID of this user is 2ncnab6pkwjmckn6i2niknkr4
The calendar ID for all these events is d6hg8h7c57bx926toavj6tc9q
Here are the pairs of events that have identical data but different event IDs:
5rc0a29m3j8aw39uln228uyv and enn1w0w1x862t39upeqnhde1e
8e3axp1rtqon780xq3f2x242t and 6ov6kvsqswqrthru9ktnnvnlo
fw39ttmbnqfttppvh9au9m35 and dvhdce880pbbpw5e0xmrp7iai
d7pekrqot18ksbv76zjru0yzo and 2wqkb0ebzzzvmm5hl2dxuiymc
2wqkb0ebzzzvmm5hl2dxuiymc and d7pekrqot18ksbv76zjru0yzo
6jmiyxn5px913zw1havpfer7s and cft5si4ac6gsujouv87275qn0
790x1c6omswe018o0om5uvtlh and 4apbs7rhfz7xjwkc5l0f2qxtn
ev25fsxy2mm6wvdyn8ool0fs2 and 6f92dcpaeh4aheygi0px7e259
c1ktorpee2wtjowfn9ushwtci and 8uy25k4r7ug6qwmn29upx06qf
bf836ol0p8dbmq66pd342m3ij and co9aehxq3c8g1ugidfit76up4
249ifo6pxjhdeqeqlknylfnkk and lcf6f4pjbhzrr11awkrjw6dn
6rys9s4ag4sanho5lazglcjw9 and 9j7i0t664rkp5lcwofcs9g55m
2u2sltush4ij0d4x502gz0zw8 and 6qw8hjuq2bxhxsv34w477p3r8
47g1o8rpoejolplbqj9pyug9t and abpf9p2eeifrbksgy1432x82s
87dks93wfcnsdoha8c6kpykf4 and 5bjnykg45fajv6x1f75wuvhay
2oj9t3gz0wyz4ir4rjpm7ba2k and 67ruyrgk9iq9kiqshboh43j3h
Let me know if I can provide anything else that would help.
Thank you!
Jeff
On Mon, Apr 6, 2015 at 2:42 PM, Jeff Meister<EMAIL_ADDRESS>wrote:
I spoke with our assistants, and it sounds like recurring events are pretty common on our customers' calendars. The reason I brought up Google, even though we're talking about Exchange calendars here, is because of how our assistant software works. Basically, our assistants schedule in Gmail and Google Calendar, with our software providing extra capabilities inside those interfaces. To manage an executive's Google calendar, he can simply share it with us directly. But for Exchange, the executive logs in to Nilas which syncs his calendar, then our backend fetches the data from Nilas and populates a corresponding Google calendar for the assistant to interact with. Then we watch the Google and Nilas calendars for new data to sync between them. So, if our assistant creates a recurring event, the RRULE will be specified in Google's format, and we must translate it to a format that Nilas can handle for an Exchange calendar. That's why I was wondering about compatibility. We're taking your sync and doing another sync with it!Hi Christine,I've been waiting for accounts to sync before using them with Esper due to the way we implemented things, which involves an initial sync of some calendar data and then uses your delta sync API thereafter. If we change it to use the delta for everything, and Nilas sends us info as it comes in, that would probably work too. So I don't think this one is an issue on your end really, except that if I don't wait for the sync, there is significant delay before my actions on Nilas show up on the Exchange calendar. They eventually do, so I figured the delay was due to the sync still running. But if I wait a while before using Nilas, then everything is fast.
I think it's rare for an assistant to need to create a recurring event, and we could do that directly on Exchange for the time being... the main issue is how to present existing recurring Exchange events on Google. Without the recurrence info, we'd only get a single event on our Google calendar, and the assistant wouldn't know that some open time on the calendar is actually taken up by the recurrences. I see in your API docs that there is an option to expand recurring events, which might work, but if our assistant edits a recurring event, we will make an improper change to the Exchange calendar, probably creating a duplicate. (Our system assumes that anything on the Google calendar belongs on the corresponding Exchange calendar, and vice versa, so it will try to propagate the expanded event back to Nilas, although perhaps we can special case this.)
Let me know how long you think it would take to get recurrence support for Exchange, if possible in the RRULE format that Google and others use, or something translatable to it. If it helps, I think we'd be OK with read-only support for a while, but without that I think this may be a blocker for us, unless I can figure something out with expanded events.
As for timezone to fix all-day events, we do collect the timezone of our customers already, so we can supply that. For specifying the timezone, we use the IANA zone names (like America/Los_Angeles) as in the tz database. Users prefer the abbreviations, but we've found this easier for machines, since abbreviations can be ambiguous and they require knowing about daylight savings (PST vs. PDT).
Thanks again,
Jeff
On Thu, Apr 2, 2015 at 6:41 PM, Christine Spang<EMAIL_ADDRESS>wrote:
For (2), we're also considering making a best guess on the user's timezone based on the timezone of the last event on the user's calendar, or a couple previous events. It requires a bit more thought. Let me know if you have any thoughts. (In general, we'd like to avoid complicating the API with provider-specific parameters that make it so you can't specify the same event the same way across providers.)
On Apr 2 2015, at 6:03 pm, Christine Spang<EMAIL_ADDRESS>wrote:
Hi Jeff,
The state machine for our Exchange syncs isn't being interpreted correctly by our developer console dashboard—we've created a ticket in our bug tracker to make sure we fix this.
Do you need an account to be fully synced before the user can start using Esper? Were you seeing problems before a day or so had passed? We've designed our sync algorithm to be usable from the time an account is connected, even if all data is not yet synced, so I'm curious to hear if you were running into specific issues.
Here are answers to your other questions:1. We have complete read-only support on Google calendars, but not for Exchange yet. Exchange uses a different format from RRULEs, and we haven't implemented the expansion yet. This is exposed via the `recurrence` property on events, but we haven't done much testing so we're not sure if it's useful to end-users in its current state. (If you take a look at it at all, let us know what you find out.)
Do you need this? If so, we can add it to our roadmap. We've planned to do it, but it hasn't been a blocker for anyone yet so we've been prioritizing other features.
2. As Kavya explained previously, this is a fundamental limitation of how Exchange implements calendars that can only be solved by manually specifying the user's timezone correctly when creating an all-day event. We can't reliably determine this from a user's account, so to fix this properly you'd have to be able to send our API the user's timezone. (On Exchange, "all day" events are treated as a 24-hour timespan, so if we send the event in UTC, and the user's calendar is set to display in PST... bam, display issue.)
If you can get this timezone information, would this API modification to how "when" blocks work for Exchange event creation solve your problem?
"when" : {
"date": "2015-04-15","timezone": "PST"
},
(Still thinking about the best way to specify timezones, but you get the gist of it.)
If so, this is not too difficult to implement on our end and we can have it to you by next week sometime. Let us know.--Christine
On Apr 2 2015, at 3:46 pm, Jeff Meister<EMAIL_ADDRESS>wrote:
JeffThanks,I'll let you know if we run into problems with our customer's account, which is rather large. I'm optimistic, though!2. I tried specifying an all day event with just a single date field as Kavya explained, and Nilas accepted this, but I'm still seeing the event span two days in O365: my all day 4/10 event covers both 4/9 and 4/10. It's consistently going back one day for me... maybe this is related to the timezone issue Kavya also mentioned? My Nilas API responses just have dates, but if 4/10 is being interpreted in PST, that might be subtracting some hours and getting us to 4/9. Not sure though.1. One thing I forgot to test was recurring events. It looks like you and Google use the same strategy for specifying recurring events: just embed the RRULE as a string in RFC format. I'm not too familiar with this part of iCalendar, so I'll have to read some documentation, but I'm wondering if you think it will work to just copy RRULEs between Google and Nilas. Are you aware of any incompatibilities in how this spec is implemented? I'll keep looking into it myself, just wanted to know if there are any gotchas I should be prepared for here. Recurrences get pretty complicated.A couple minor questions for you:Hi everyone,We decided to try one more testing account and have an assistant play with it before adding the real customer. This account sees daily use, so it's a more realistic test case than my fake accounts. The initial sync to Nilas took a while, but it seems to have stabilized now, and events are syncing in both directions... looking good! We're going to have our real customer sign into Nilas and give his account some time to sync up (a day or so?) before using it. I noticed on my Nilas dashboard that our latest test account sometimes says "Sync Issue" or "Downloading", but eventually it goes back to "Running".
On Tue, Mar 31, 2015 at 2:35 PM, Andrew Lee<EMAIL_ADDRESS>wrote:
Yep. By the end of the week (barring crazy things happening), we should be testing with some current O365 executives and we'll let you know if we experience any problems.
On Tue, Mar 31, 2015 at 2:07 PM Christine Spang<EMAIL_ADDRESS>wrote:
Per our conversation today:
You folks are going to start onboarding Exchange users, having them directly auth to Nilas instead of using Exchange shared calendars.
We're going to scope+spec application scopes (specifically for calendars vs mail) and work implementation into our roadmap. We have a big conference+company offsite coming up in the next two weeks, so are not sure about the timing for the project right now. In the meantime, you can get started without anything specific from us.
As mentioned on the call, we're right in the middle of an improvement project for our Exchange auth flow, which includes providing better error messages when things go wrong and creating some better documentation about what each screen of the auth flow looks like on our end. Let us know if you have any questions before that's live, and if you have any trouble with Exchange sign-ins, we're available to help figure out what's going wrong.
cheers,Christine
On Mon, Mar 30, 2015 at 6:00 PM, Christine Spang<EMAIL_ADDRESS>wrote:
Great, talk to you tomorrow. :)
On Mar 30, 2015 5:48 PM, "Andrew Lee"<EMAIL_ADDRESS>wrote:
Yeah, that's fine. Let's jump on the phone then. Blake will follow up with calendar invites etc.
On Mon, Mar 30, 2015 at 5:46 PM Christine Spang<EMAIL_ADDRESS>wrote:
Does 1pm tomorrow work for a call?
On Mon, Mar 30, 2015 at 5:28 PM, Andrew Lee<EMAIL_ADDRESS>wrote:
Thanks so much for the e-mail! Christin, on Shared Calendars, we're happy to jump on the phone today or tomorrow to come up with a solution. This is very important to us and we'd like to get a resolution soon. -A
On Mon, Mar 30, 2015 at 12:48 PM Kavya Joshi<EMAIL_ADDRESS>wrote:
Hi Jeff,
Thanks for the detailed response!
With respect to all-day event creation, there are a couple of issues:1. The display of all-day events depends on the timezone the calendar is set to in O365 (Calendar settings < Options < General < Region and timezone):
Since the `when` field for event creation using the Nilas API is specified in the UTC timezone and is sent to the Exchange server in this timezone too, if your O365 calendar is set to the UTC timezone, it will display as expected. However, if your calendar is set to a different timezone (for e.g. UTC-8), the event will display incorrectly. The same behavior is observed if you create an all-day event in the O365 UI and then change the timezone in the options.
To overcome the timezone-dependency of the display, we plan to allow users to specify timezone information as well while creating events - we'll keep you updated on it.
2. There was a small error in the end-dates we were sending the server for all-day events, which caused the incorrect event durations. The fix for this is now live, so this should not be an issue anymore - please let us know if it is!
To answer your question about date ranges for events -* to create an all-day event on a single day using the API, provide a date object for the `when` field.For example, to create an all-day event on 04/11/2015:when = {"date": "2015-04-11"}
* to create an all-day event spanning multiple days, provide a datespan object for the `when` field. In this case, the end-date is /inclusive/.For example, to create an event that runs all-day on the 11th, 12th, 13th and 14th (inclusive):when = {"start_date": "2015-04-11","end_date": "2015-04-14"}
Does that help?
With respect to shared calendars, Christine will be in touch.
Thanks!Kavya
On Thu, Mar 26, 2015 at 3:07 PM, Jeff Meister<EMAIL_ADDRESS>wrote:
- JeffThanks again, and let me know if you need any more info or clarification.Sorry for the long email, I'm just trying to be clear. I should have noticed this issue before, but I had been testing with owned calendars figuring that shared calendars would work the same, as they do in Google. That's what I get for assuming EAS would be cooperative! If you can think of an alternative approach, we'd be very happy to hear it.If we can't get shared calendars through EAS or another protocol, we may have to rethink how we're doing things. I thought of sharing the calendar in the other direction, where our assistant creates it on her account and shares it with the executive, but then we still wouldn't be able to see free/busy times on the executive's other calendars, and they probably won't want to use our calendar exclusively. The only other thought I'm left with is to have the executive sign in to Nilas with his own account. But that just pushes the privacy issue up the chain; while you could restrict our access through your API, our customers probably don't want a third party having access to all their email etc. Does Exchange have some access control capabilities that could help here? Maybe there is a way for our customers to sign in to Nilas with their own accounts, but then choose only to share their calendars with Nilas, kind of like how Google's OAuth domains work?I tried checking my test O365 account that had some shared calendars with my iPhone like you suggested, and indeed I did not see the shared calendars... only the owned calendars showed up. Unless there's an undocumented part of EAS that Apple isn't aware of, I guess we may not be able to access shared calendars through that protocol, as you said. The shared calendars do show up on the O365 interface, and everything works there as you'd expect, but since that's a cloud service I have no idea what (likely private) API they are using.  However, the customer we would like to onboard first does use O365.On the topic of shared calendars, let me explain our use case. Esper employs some in-house assistants to handle scheduling for our customers, who are mostly busy executives. Our assistants use custom software that is built on top of Gmail and Google Calendar, both frontend (browser extension to enhance the interface) and backend (server to automate various workflows using Google APIs). Each assistant logs into a Google account, and our customers share their calendars from their own private Google account to ours. This lets our assistants see free/busy times for the executives and create appropriate events for them, without requiring the executive to give us his private login information.We would like to support executives who use Exchange calendars, but we're trying to avoid replicating our frontend work on top of O365 or desktop Outlook, and we don't want to deal with the Exchange APIs either. Our plan was to have Exchange executives share their calendars with our assistant's own Exchange account (often created by the executive's organization for our use). Then, we would authenticate our assistant's account with Nilas, and our backend would use your API instead of Microsoft's. For the frontend, we have some custom code that mirrors the Nilas data over to a Google calendar where our assistant can use our software.
On Thu, Mar 26, 2015 at 12:40 PM, Jeff Meister<EMAIL_ADDRESS>wrote:
It seems like there is some confusion between me, Nilas, and O365 about whether an end time or date is part of the range. How should I be specifying my ranges to Nilas? And could this account for the off-by-one behavior I'm seeing on my O365 calendar?So, I tried creating a Nilas event with start and end dates both set to 4/2. This did result in a single-day event in O365, but it was on 4/1 instead of 4/2. The sidebar also says "0 minutes", even though everything looks fine on the calendar. I noticed that my Nilas API response contained a when field with a single date 4/2 instead of a datespan, so I also tried creating my event this way, but the result on O365 was the same as the 4/2 to 4/2 datespan.When I create an event on Nilas with a start date of 4/2 and end date of 4/3, it appears on the O365 calendar across two days: 4/1 and 4/2. Opening its details confirms that it has those start and end dates, even though my Nilas API response said 4/2 to 4/3. Strangely, the sidebar of O365 says "1 day" for the event duration. To make it appear only across 4/2, I had to go into the event on O365 and set both start and end dates to 4/2.Hi Kavya and others,I just tested the all-day events again, and the problem of showing up at 4 or 5pm is gone, but I'm still having some issues that I think are related to whether the end date is exclusive or inclusive. When I request an all-day event through the Google Calendar API, say on 4/2, I get back an event with a start date of 4/2 and end date of 4/3. I was assuming that Nilas worked the same way, with exclusive end times/dates (i.e., just beyond the end of the time range).
I'll write a different response regarding shared calendars, because this email is already a bit long.
Thank you,
Jeff
On Wed, Mar 25, 2015 at 9:49 PM, Kavya Joshi<EMAIL_ADDRESS>wrote:
Hi Andrew, Jeff
At first glance, it seems like the ActiveSync protocol does not support syncing shared calendars. We're going to double check this with a mobile phone, since sometimes ActiveSync features are undocumented.In the meantime, could you please tell us how you plan to use synced shared calendars? We don't want this to be a blocker for you and might be able to suggest an alternative approach.
W.r.t creating all-day events through Nilas, did you have the chance to test it again?From the logs, it looks like your prior testing for the following accounts might've occurred before the fix was<EMAIL_ADDRESS>Thanks!Kavya
On Wed, Mar 25, 2015 at 4:26 PM, Christine Spang<EMAIL_ADDRESS>wrote:
Hi Andrew,
Kavya's taking a look at this today. We'll get back as soon as we have more info.
--Christine
On Wed, Mar 25, 2015 at 9:35 AM, Andrew Lee<EMAIL_ADDRESS>wrote:
Hey guys, just wanted to check up on what you think about this issue. I'm really hoping it's a small issue because once this is fixed, we're gonna start on-boarding people.
On Mon, Mar 23, 2015 at 5:01 PM Jeff Meister<EMAIL_ADDRESS>wrote:
JeffThanks,Hello again,Andrew brought another issue to my attention: some of the calendars we use are not actually owned by the account we log into. They are owned by a different account and shared with us. On the O365 interface, these calendars appear under "Other calendars" instead of "My calendars", similar to Google's behavior. I tried sharing a couple calendars between test accounts, and they show up in O365, but I haven't seen them appear in Nilas. I don't think it's a sync delay issue, because I created another owned calendar and that one showed up in Nilas immediately. Are you folks able to access and sync shared O365 (or other Exchange) calendars? I'm hoping this is simply a matter of checking an extra data field.
On Mon, Mar 23, 2015 at 2:53 PM, Jeff Meister<EMAIL_ADDRESS>wrote:
JeffThank you,Still no luck with Andrew's Exchange account, same error as before. I'm not sure what's up with it. If I can get another standalone Exchange account to test with, I'll report my findings there.Hi Christine,I was just about to send an email with our latest results. From my testing this morning, I see that deletes and guests are working, so the issues (1) and (2) from my previous email are fixed! Things are looking pretty good today, I'm seeing creates/updates/deletes sync in both directions.
One thing maybe worth mentioning: when I began testing this morning, at first I thought Nilas wasn't syncing to O365, because my actions weren't going all the way through to the O365 side even though my Nilas API calls were successful. However, when I checked back around 30min later, everything had showed up. I presume you have to queue up actions to send to the real Exchange server, but usually my Nilas interactions sync back within seconds (except deletes sometimes take a bit longer). Perhaps your reset of my test accounts made them require a bit more background syncing to catch up to the point where my actions would go through? Anyway, it's working more quickly now, I'm just curious what we should expect when dealing with real customer calendars (which will be larger than my testing ones).
As for all-day events, the ones I created through O365 are showing up properly on the Nilas side, but I'm still seeing all-day events show up at improper times on my O365 calendar when I add them through Nilas. Maybe your deploy happened after I tested that, so I'll keep trying this afternoon and let you know how it goes.
On Mon, Mar 23, 2015 at 2:34 PM, Christine Spang<EMAIL_ADDRESS>wrote:
Heya folks,
We hadn't implemented support for the "All Day" bit for Exchange events. We just shipped a patch this morning that implements this support. Does this fix your issue?
Has anything else come up?
Let us know.--Christine
On Fri, Mar 20, 2015 at 6:58 PM, Christine Spang<EMAIL_ADDRESS>wrote:
Eben scrutinized our logs about the Exchange issue, and as far as we can tell, the Exchange server may have repeatedly encountered an internal server error trying to service the auth request. We haven't seen this before, but as best we can tell there's not much we can do in this case, other than have you try again to auth later. Does it work for you now?
We'll keep in mind that this can happen as we're working on improving the feedback in the Exchange auth flow.
Karim's worked up a fix for all day events as well, which we'll ship to production as soon as it's not Friday night. :)
Have a great weekend,Christine
On Fri, Mar 20, 2015 at 1:41 PM, Christine Spang<EMAIL_ADDRESS>wrote:
Hey Andrew,
He sure did. Shipped with a regression test this time, and I reset the calendar syncs for your Exchange accounts so this should be back-applied to existing events as well.
Eben's going to trawl the logs to look at what happened with your attempt to reauth your college account today as well, and Karim reports that it's not too difficult to fix the issue with all day events and Exchange either, so hopefully we'll have that fixed on production for you folks next week.
Excited that you can start testing with a customer! Let us know what we can do to support.--ChristineOn Mar 20 2015, at 11:54 am, Andrew Lee<EMAIL_ADDRESS>wrote:
Hi Christine,
Just wanted to check on whether Karim was able to come up with a fix for the second issue. We can begin testing if you guys have a sense as to what's happening there.
-Andrew
On Tue, Mar 17, 2015 at 2:06 PM Christine Spang<EMAIL_ADDRESS>wrote:
Hi Jeff,
1. The deletes issue was due to a bad code deploy yesterday, which we have already fixed. Sounds like you were testing right around the time of the deploy!
2. Karim's going to take a look at this later today.
re: Andrew's school Exchange account, we'll take a look at the logs. We also have a project planned to make the Exchange sign-in process less arcane, which will make whatever is going wrong in cases like this more apparent to the user signing in.
I'll see if we can take a look at the all day events issue this week as well.
--Christine
On Tue, Mar 17, 2015 at 1:01 PM, Jeff Meister<EMAIL_ADDRESS>wrote:
JeffLet me know if you need any more details. Thanks again!I'm repeating this because now I'm noticing that the event is from 5pm to 5pm, and we're in DST now but weren't when I reported 4pm to 4pm before. So, I suspect the bug is related to timezone handling for all-day events.And finally, this one is not a regression, it's an issue I've seen before that I just wanted to bring to your attention again:2. When I add a guest on my O365 event that only has an email address (no name), the Nilas event I get has the email address in the participant name field and the email field set to null. This didn't happen in the past; I remember that guests were working both ways in previous tests. A guest added to Nilas shows up fine on the O365 side.1. Event deletions aren't propagating from Nilas to my O365 calendar anymore. The Nilas API call to delete the event succeeds (with a response of null), and I see my delete in the delta sync, but the event remains in O365. I waited a while to see if the deletion was simply queued up, but it never went through.Hello Michael and other Nilas folks,I've done some testing of your latest fixes, and I'm happy to report that the sync anomalies from before are no longer occurring! With two Office 365 test accounts, Nilas has been syncing consistently both ways, although I did run into a few bugs, listed below. These things were all working in the past, so hopefully they are not huge issues to fix. These two are the most important for us:
This one is less important, since the initial customer we'll be trying out is on O365:
- I can't sign in with Andrew's school Exchange account anymore. Maybe I'm doing something wrong, but I think I used the same login procedure that worked last time... it just tells me "Sorry, an error occurred." Can you see anything in your logs for account<EMAIL_ADDRESS>that might explain more?
- All-day events show up on my O365 calendars at the wrong time. Here is what I said before:
"If I create an all-day event through Nilas, say on Thursday, then I get the expected API response with a datespan of 2015-02-12 to 2015-02-13, but the event I see on O365 is actually from 2015-02-11 4:00pm to 2015-02-12 4:00pm. My calendar is in Pacific Time, if that helps. I've only seen this happen for all-day events."
On Sun, Mar 15, 2015 at 9:30 PM, Michael Grinich<EMAIL_ADDRESS>wrote:
Hi Jeff,
Regarding the ActiveSync protocol, I usually invoke Hanlon's razor. :(
We *definitely* want you to have a big success with this first account! Did you find any bugs or issues this weekend? What can we do to help you roll-it out?
Exciting stuff!
--Michael
On Fri, Mar 13, 2015 at 2:28 PM, Jeff Meister<EMAIL_ADDRESS>wrote:
JeffThank you,Hi Christine, So the Exchange server sometimes decides to just change event IDs on you, and you have to detect this situation by comparing the data fields? Wow, that almost sounds like Microsoft is breaking compatibility for third parties intentionally. I'm really glad you were able to figure it out!I'll be doing some more testing this afternoon and over the weekend, so I'll let you know if I run into other issues, but I think this was the last major thing blocking us. A few weeks ago, I successfully demonstrated creation, modification, and deletion of events being propagated both ways between Nilas and an O365 account. For whatever reason, the event ID changing didn't occur that time. And I suspect that my previous issues with occasional floods of sync data, which included duplicates of old events, were due to the same ID-changing issue you just fixed.
So, if everything looks fine with my test accounts over the weekend, I think our next step will be to try hooking up a real customer. We currently have an executive who we're serving separately with regular MS Exchange software, and our assistants would really like to use our own software instead, which Nilas integration will enable. But I've been worried about the possibility of bugs either messing up the executive's live calendar or confusing the assistants on our end, which is why I've been using fake test accounts. If the anomalies don't appear again, I'll feel more confident about hooking up this customer.
On Thu, Mar 12, 2015 at 5:40 PM, Christine Spang<EMAIL_ADDRESS>wrote:
Hi Andrew and Jeff, I wanted to let you know that we shipped this fix to production this week as expected. If you see any more anomalies with event changes in delta sync responses, let us know. It's still possible that if you change every single part of an event (title, location, start time, end time), the ID could change in the API response---but modifications to a subset of attributes should retain the same ID. What are your next testing steps? I'm curious how far along you folks are, and what else may be blocking you. --Christine On Fri, Mar 6, 2015 at 8:30 PM, Andrew Lee<EMAIL_ADDRESS>wrote: Thanks so much for the update Christine! On Fri, Mar 6, 2015 at 7:51 PM Christine Spang<EMAIL_ADDRESS>wrote: Hi Andrew, We shipped this fix to our staging environment today, and expect to ship it to production next week. Basically, there are some cases in Exchange ActiveSync where event IDs provided by the server may change, and we needed to implement extra heuristics to match events in order to prevent our event IDs from changing as well. As you can imagine, this is pretty tricky to get right, so we've been taking some extra time to test it. I'll let you know when this is live. --Christine On Mar 5, 2015 3:12 PM, "Christine Spang"<EMAIL_ADDRESS>wrote: Hi Andrew, Apologies for the long delay here. Kavya has figured out what's going with the changing IDs for Exchange calendar, and has been working on a fix for a few days now. We don't need any more information from you folks right now. You've been super helpful testing the calendar support. Thanks a ton. --Christine On Thu, Mar 5, 2015 at 1:27 PM, Andrew Lee<EMAIL_ADDRESS>wrote: Hey guys, Just wanted to check up on the status of your changes related to Nilas/Esper. I took the liberty of creating a separate e-mail thread, since the last one was 61 messages long, kept just the latest two messages that mattered, and removed Tikhon, nilas support, and removed all of your old inboxapp e-mails. Let us know how we can help! -Andrew On Tue, Feb 24, 2015 at 11:18 AM, Christine Spang<EMAIL_ADDRESS>wrote: Thanks for this report, Jeff. We're looking into it and should have some more info for you soon. On Mon, Feb 23, 2015 at 2:42 PM, Jeff Meister<EMAIL_ADDRESS>wrote: Hi Christine, I was able to sign in with Andrew's Exchange account the way you explained, so I tried some testing with it today. Event creation and update was working fine in both directions, but then a sync issue popped up again, and I think it might have been triggered by me doing a delete (not sure though). Some old events appeared in my Nilas delta sync, including one duplicate. I went in our logs to investigate, and by searching for the details of the duplicate event, I found that it had been identified in previous syncs by ID "1d2ex1lni3t89w3rxh8d0in9c"... but after a certain point, I stopped seeing that ID, and instead saw ID "1zeaati82ubv706f0sraii380" with the same event details. This ID first appeared in the abnormal sync I received, and I've attached the JSON data that I saw, but here's a summary with (C)reate/(M)odify/(D)elete, ID, and title: D, 4oerzc51uazhwsnb52jbwlrgn C, dd438y3gd0xelvukq3lj6vhax, Lunch time!!! M, ah3q993oiyo3rwtieot25e5v, Wednesday event M, 7nrro21ez0cjsopbcftl0aggo, Friday morning M, 4pqygmkpyylqqvjffqx6gwbec, Friday night M, 2x130rv0h6ujkphj4s5xwwduk, Call with some dude M, 1zeaati82ubv706f0sraii380, Short meeting M, 11kzbfgr3bes717kgv1bjwc02, Look out the window Some of these events are from my testing today, but "Wednesday event", "Friday morning", and "Friday night" are from a week or two ago, and I haven't touched them since then. This is what I mean by old events suddenly appearing. Our current implementation actually ignores the data in the delta sync besides the ID, then it goes and looks up the event details using the endpoints based on ID. Looking at the logs, that appears to have worked fine at the time, and the existence of two IDs with the "Short meeting" details explains why I saw a duplicate (our system assumes that new ID = new event). Now, some minutes later, after I tried looking up the details of ID "1d2ex1lni3t89w3rxh8d0in9c" and got "Short meeting" as expected. But when I tried looking up "1zeaati82ubv706f0sraii380", expecting the same "Short meeting" as I saw in the delta sync... instead I got a different event, "Wednesday event"! Confused, I went to look up the rest of the IDs above, and here's what I got (ID, title): 4oerzc51uazhwsnb52jbwlrgn, N/A (event was deleted) dd438y3gd0xelvukq3lj6vhax, Look out the window ah3q993oiyo3rwtieot25e5v, Friday morning 7nrro21ez0cjsopbcftl0aggo, Friday night 4pqygmkpyylqqvjffqx6gwbec, Call with some dude 2x130rv0h6ujkphj4s5xwwduk, Short meeting 1zeaati82ubv706f0sraii380, Wednesday event 11kzbfgr3bes717kgv1bjwc02, Look out the window It almost looks like an off-by-one pattern, but there are weird swaps too that don't seem to follow any rule. I have no idea what to make of this. I can't find anything in our logs to suggest our side is causing this... the last appearance of e.g. "1zeaati82ubv706f0sraii380" in my log file associates it with "Short meeting", and I see no API calls that could have put "Wednesday event" data in there. I wish I could reproduce this better and more consistently... hopefully this detail is of some use. I've attached a pretty-printed JSON file containing the sync whose IDs I'm referring to above. Thanks again, Jeff


|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object | +--org.jgap.xml.XMLManager
The XMLManager performs marshalling of genetic entity instances (such as Chromosomes and Genotypes) to XML representations of those entities, as well as unmarshalling. All of the methods in this class are static, so no construction is required (or allowed).
| Method Summary | |
static Chromosome |
getChromosomeFromDocument(Configuration a_activeConfiguration,
org.w3c.dom.Document a_xmlDocument)
Unmarshall a Chromosome instance from a given XML Document representation. |
static Chromosome |
getChromosomeFromElement(Configuration a_activeConfiguration,
org.w3c.dom.Element a_xmlElement)
Unmarshall a Chromosome instance from a given XML Element representation. |
static Gene[] |
getGenesFromElement(Configuration a_activeConfiguration,
org.w3c.dom.Element a_xmlElement)
Unmarshall a Chromosome instance from a given XML Element representation. |
static Genotype |
getGenotypeFromDocument(Configuration a_activeConfiguration,
org.w3c.dom.Document a_xmlDocument)
Unmarshall a Genotype instance from a given XML Document representation. |
static Genotype |
getGenotypeFromElement(Configuration a_activeConfiguration,
org.w3c.dom.Element a_xmlElement)
Unmarshall a Genotype instance from a given XML Element representation. |
static org.w3c.dom.Document |
representChromosomeAsDocument(Chromosome a_subject)
Marshall a Chromosome instance to an XML Document representation, including its contained Gene instances. |
static org.w3c.dom.Element |
representChromosomeAsElement(Chromosome a_subject,
org.w3c.dom.Document a_xmlDocument)
Marshall a Chromosome instance to an XML Element representation, including its contained Genes as sub-elements. |
static org.w3c.dom.Element |
representGenesAsElement(Gene[] a_geneValues,
org.w3c.dom.Document a_xmlDocument)
Marshall an array of Genes to an XML Element representation. |
static org.w3c.dom.Document |
representGenotypeAsDocument(Genotype a_subject)
Marshall a Genotype to an XML Document representation, including its population of Chromosome instances. |
static org.w3c.dom.Element |
representGenotypeAsElement(Genotype a_subject,
org.w3c.dom.Document a_xmlDocument)
Marshall a Genotype instance into an XML Element representation, including its population of Chromosome instances as sub-elements. |
| Methods inherited from class java.lang.Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Method Detail |
public static org.w3c.dom.Document representChromosomeAsDocument(Chromosome a_subject)
a_subject
- The chromosome to represent as an XML document.
public static org.w3c.dom.Document representGenotypeAsDocument(Genotype a_subject)
a_subject
- The genotype to represent as an XML document.
public static org.w3c.dom.Element representGenesAsElement(Gene[] a_geneValues, org.w3c.dom.Document a_xmlDocument)
a_geneValues
- The genes to represent as an XML element.a_xmlDocument
- A Document instance that will be used to create
the Element instance. Note that the element will
NOT be added to the document by this method.
public static org.w3c.dom.Element representChromosomeAsElement(Chromosome a_subject, org.w3c.dom.Document a_xmlDocument)
a_subject
- The chromosome to represent as an XML element.a_xmlDocument
- A Document instance that will be used to create
the Element instance. Note that the element will
NOT be added to the document by this method.
public static org.w3c.dom.Element representGenotypeAsElement(Genotype a_subject, org.w3c.dom.Document a_xmlDocument)
a_subject
- The genotype to represent as an XML element.a_xmlDocument
- A Document instance that will be used to create
the Element instance. Note that the element will
NOT be added to the document by this method.
public static Gene[] getGenesFromElement(Configuration a_activeConfiguration, org.w3c.dom.Element a_xmlElement) throws ImproperXMLException, UnsupportedRepresentationException, GeneCreationException
a_xmlElement
- The XML Element representation of the Chromosome.
ImproperXMLException
- if the given Element is improperly
structured or missing data.
UnsupportedRepresentationException
- if the actively configured
Gene implementation does not support the string representation
of the alleles used in the given XML document.
GeneCreationException
- if there is a problem creating or
populating an Gene instance.public static Chromosome getChromosomeFromElement(Configuration a_activeConfiguration, org.w3c.dom.Element a_xmlElement) throws ImproperXMLException, InvalidConfigurationException, UnsupportedRepresentationException, GeneCreationException
a_activeConfiguration
- The current active Configuration object
that is to be used during construction of
the Chromosome.a_xmlElement
- The XML Element representation of the Chromosome.
ImproperXMLException
- if the given Element is improperly
structured or missing data.
InvalidConfigurationException
- if the given Configuration is in
an inconsistent state.
UnsupportedRepresentationException
- if the actively configured
Gene implementation does not support the string representation
of the alleles used in the given XML document.
GeneCreationException
- if there is a problem creating or
populating an Gene instance.public static Genotype getGenotypeFromElement(Configuration a_activeConfiguration, org.w3c.dom.Element a_xmlElement) throws ImproperXMLException, InvalidConfigurationException, UnsupportedRepresentationException, GeneCreationException
a_activeConfiguration
- The current active Configuration object
that is to be used during construction of
the Genotype and Chromosome instances.a_xmlElement
- The XML Element representation of the Genotype
ImproperXMLException
- if the given Element is improperly
structured or missing data.
InvalidConfigurationException
- if the given Configuration is in
an inconsistent state.
UnsupportedRepresentationException
- if the actively configured
Gene implementation does not support the string representation
of the alleles used in the given XML document.
GeneCreationException
- if there is a problem creating or
populating an Gene instance.public static Genotype getGenotypeFromDocument(Configuration a_activeConfiguration, org.w3c.dom.Document a_xmlDocument) throws ImproperXMLException, InvalidConfigurationException, UnsupportedRepresentationException, GeneCreationException
a_activeConfiguration
- The current active Configuration object
that is to be used during construction of
the Genotype and Chromosome instances.a_xmlDocument
- The XML Document representation of the Genotype.
ImproperXMLException
- if the given Document is improperly
structured or missing data.
InvalidConfigurationException
- if the given Configuration is in
an inconsistent state.
UnsupportedRepresentationException
- if the actively configured
Gene implementation does not support the string representation
of the alleles used in the given XML document.
GeneCreationException
- if there is a problem creating or
populating an Gene instance.public static Chromosome getChromosomeFromDocument(Configuration a_activeConfiguration, org.w3c.dom.Document a_xmlDocument) throws ImproperXMLException, InvalidConfigurationException, UnsupportedRepresentationException, GeneCreationException
a_activeConfiguration
- The current active Configuration object
that is to be used during construction of
the Chromosome instances.a_xmlDocument
- The XML Document representation of the Chromosome.
ImproperXMLException
- if the given Document is improperly
structured or missing data.
InvalidConfigurationException
- if the given Configuration is in
an inconsistent state.
UnsupportedRepresentationException
- if the actively configured
Gene implementation does not support the string representation
of the alleles used in the given XML document.
GeneCreationException
- if there is a problem creating or
populating an Gene instance.
|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |


Matthew 9:22 says
"...Be of good comfort: thy faith hath made thee whole."
Be not troubled, discouraged or doubt or fear whatsoever the devil might be saying into your ears. Just be of good cheers in the word o God.
Matthew 9:29 says
"...According to your FAITH be it unto you."
"Ïf you have faith as a grain of mustard seed, you will say to this mountain, Remove hence to yonder place: and is shall remove: and nothing shall be impossible unto you.


Cute Dog Idea
Cute dogs come in a variety of shapes and sizes.
Many people also have their own barometers for what makes a cute dog.


Sues Test Page
User input, get value and save to db when Submit is clicked
Submit
JSON API convert to object. Use Object Keys and Add to DB for API


Musk down €700m after Tesla Cybertruck launch
by Michael StainesElon Musk is down around €700m today after the launch of the company’s new electric pickup truck was marred by an “armour glass” window fail.
Shares in the firm fell after two of the new Cybertruck’s windows were smashed during a demonstration of how strong they are.
After the truck was unveiled in California, Mr Musk told the audience: “You want a truck that's really tough, not fake tough.”
“You want a truck you can take a sledgehammer to. A truck that won't scratch, that doesn't dent.”
The truck was not damaged when Tesla designer Franz von Holzhausen hit the door with a sledgehammer; however, the window demonstration was not so successful.
After he smashed the first one by throwing a metal ball at it, Mr Musk was heard to say, “oh my f****** God.”
“Maybe that was little too hard,” he added.
He admitted there was room for improvement in the design, and said the company would fix the problem in the coming months.
He also share footage of the windows holding firm during a test carried out before the launch
The ‘Cybertruck’ aims to take a slice of America’s most lucrative car market – with production due to begin in late 2021.
Built to function on Earth or Mars, the vehicle has the "utility of a truck and the performance of a sports car.”
It can tow up to 14,000lbs and can accelerate from 0 to 95kph in 6.5 seconds.
Tesla stocks fell by more than 6% following the launch – cutting Mr Musk's net worth by $768m (€697m) in a single day.
With a bank balance of around $23.6bn (€21.4bn), he remains the 41st richest person in the world according to Forbes magazine.


Hosting
After your website is customly built we make a backup copy of the site a minimum of three times and place in three datacenters located in any part of the world of your choice.
With stormy cloud hosting your website is always up and available.
stormycloudhosting.com will place your custom site in the cloud and make a backup copy of the site a minimum of three times and place in three datacenters located in either East or West Coast link Our webservice can handle 1 to thousands of request per day giving your web and mobile sites ultimate scalability
Development
We apply the latest in Software development and push the code to your customized site!.
Design
Responsive design that scales to any mobile device. Upload your photos and we will add sharpened enhancements and include in your site
Need custom design, development, or photography? we've got you covered on that too!
Marketing + SEO
Marketing is an essential tool for your business!
stormy cloud has a blogging system that helps you easily add photos to galleries, make enquries, direct users to your Social accounts, and email marketing.


The adverb \ operated on subsets of the operand y that were taken in a regular way. Now we will take the next step, and operate on irregular subsets of y . This will finally give us the chance to do interesting work with character strings.
Find Unique Items: Monad ~. and Monad ~:
Monad ~. has infinite rank. ~. y is y with duplicate items removed and is called the nub of y . The items of ~. y are in the order of their first appearance in y :
~. 'Green grow the lilacs'
Gren gowthliacs
]a =. _2 ]\ 0 1 1 2 0 1 2 3 1 3 1 2
0 1
1 2
0 1
2 3
1 3
1 2
~.a
0 1
1 2
2 3
1 3
y can have any rank, and ~. y gives the unique items.
Monad ~: has infinite rank and tells you which items monad ~. would pick. ~: y is a Boolean list where each element is 1 if the corresponding item of y would have been selected for the nub of y :
~: 'Green grow the lilacs'
1 1 1 0 1 1 1 0 1 1 0 1 1 0 0 1 1 0 1 1 1
~: a
1 1 0 1 1 0
(~: a) # a
0 1
1 2
2 3
1 3
~. y is equivalent to (~: y) # y .
Dyad u/. has infinite rank. x u/. y applies u to subsets of y for which the corresponding items of x (called the keys) are identical. I will skip the formal description in favor of a verbal one: First find the nub of x, call it nx . Then, for each item of nx, find all matching items of x; make an array of the corresponding items of y (this array will always have rank one more than the rank of an item of y), and apply u to that array; the result becomes one item of the result of x u/. y . The items of x u/. y thus correspond to items of the nub of x . Note that the subsets of y may have different shapes (they will all have the same rank, being made of items of y, but each subset may have a different number of items). For this reason, we usually have u produce a boxed result to avoid framing fills.
]a =. 2 0 1 0 2 </. 'Hello'
+--+--+-+
|Ho|el|l|
+--+--+-+
The subsets were created, and each one was boxed. Note that each subset is a list, even the one with only one element:
$&.> a
+-+-+-+
|2|2|1|
+-+-+-+
3 0 3 0 3 +//. 100 1 200 2 300
600 3
The summing was performed for each subset. Note that the result is sorted not on the value of the keys, but rather on the smallest index of each key in x .
]a =. _2 ]\ 'Fred';100;'Joe';200;'Fred';50;'Sam';30
+----+---+
|Fred|100|
+----+---+
|Joe |200|
+----+---+
|Fred|50 |
+----+---+
|Sam |30 |
+----+---+
A small database of amounts we owe. We can quickly get a total for each creditor:
]b =. ({."1 a) +/@:>/. ({:"1 a)
150 200 30
({."1 a) gives the list of names, which we use as keys for the data given by ({:"1 a) . For each subset, we open the boxes and add up the results. Note that +/@>/. would not do in place of +/@:>/., and understand why.
It would be nice to have names associated with the totals:
(~. {."1 a) ,. <"0 b
+----+---+
|Fred|150|
+----+---+
|Joe |200|
+----+---+
|Sam |30 |
+----+---+
We box the totals using <"0 before we join items of the totals to the items of the nub. Recall that x ,. y concatenates each item of x with the corresponding item of y .We take advantage of the fact that the results of u/. have the same order as the nub.
Apply On Partitions: Monad u;.1 and u;.2
Unlike dyad u/. which applies u to scattered subsets of y, u;.n applies u to sequential subsets of y . In monad u;.n, the subsets are computed from information in y itself; in dyad u;.n, x specifies the subsets. u;.n is really 4 different cases distinguished by the number n; we will start with the case where n is 1, 2, _1, or _2 .
Avoid the error of thinking that an operation on a subset of y somehow modifies y . Never happens. In J, the result of a verb is always a new noun. You may assign that noun to the same name as one of the operands, but until you do, the old operand is unchanged, and both it and the result of the verb are available for further use.
u;.1 y partitions y by finding the items of y that match the first item of y (i. e. 0{y); each such item, called a fret, is the start of an interval of y which runs from the fret to the last item before the next fret (the last interval runs to the end of y). Monad u is applied to each interval (which is always a list of items of y), and the results of u become the items of the overall result of u;.1 y .
<;.1 ' a list of words '
+--+-----+---+------+-+
| a| list| of| words| |
+--+-----+---+------+-+
Each ' ' character, even the one at the end, started a new interval. We are not restricted to boxing the intervals:
#;.1 ' a list of words '
2 5 3 6 1
Here we report the length of each word.
u;._1 y is like u;.1 y except that the fret itself is omitted from the interval. The interval could be empty in that case:
<;._1 ' a list of words '
+-+----+--+-----++
|a|list|of|words||
+-+----+--+-----++
#;._1 ' a list of words '
1 4 2 5 0
u;.2 y and u;._2 y are like u;.1 y and u;._1 y except that the frets are those items of y that match its last item, and each marks the end of an interval:
<;.2 'Mississippi'
+--+---+---+---+
|Mi|ssi|ssi|ppi|
+--+---+---+---+
Creating An Array Using 0 :0 And ;._2
Use u;.2 y to split a list when you know the ending marker for the intervals. An important use of u;._2 is to execute u on each line of a noun that is defined with 0 :0 :
;: ;._2 (0 : 0)
Fred 500
Joe 200
Fred 50
Sam 30
)
+----+---+
|Fred|500|
+----+---+
|Joe |200|
+----+---+
|Fred|50 |
+----+---+
|Sam |30 |
+----+---+
Here (0 : 0) creates a noun from the lines that follow. Each line ends with an unseen LF character which provides a convenient fret for splitting the lines. We use ;._2 to apply monad ;: to the text of each line (not including the fret, which is dropped by ;._2). Monad ;: splits each string into words and boxes the words. The result is not the same as the array we created earlier, because the second column is character rather than numeric. We could have written noun define instead of (0 : 0) .
The verb you apply to each line of the noun depends on what is in your noun. One common choice is "., to be discussed in the next chapter, which executes each line as a sentence, returning the result.
Monad u;.n has rank 1 _ when n is 1, 2, _1, or _2 .
Apply On Specified Partitions: Dyad u;.1 and u;.2
When n is 1, 2, _1, or _2, x u;.n y has infinite rank and, in the one-dimensional case where x is a Boolean list of 0s and 1s, resembles u;.n y . The difference is that the frets are given by the positions of 1s in x rather than by values of the items of y . We can define u;.1 y as (({.y)="_ _1 y) u;.1 y, and u;.n y for the other values of n similarly.
0 1 0 1 0 +/;.1 (20 30 40 50 60)
70 110
As in this example, some leading items of y may not be in any interval.
In the general case x is a list of boxed Boolean lists, with j{::x supplying the frets for axis j . The partition is then multidimensional:
(0 1 1;1 0 0 1) <;.1 i. 3 4
+------+--+
|4 5 6 |7 |
+------+--+
|8 9 10|11|
+------+--+
In both the monadic and dyadic cases of u;.1, u;._1, u;.2, and u;._2, the partitions to which u is applied have the same rank as y (but the shapes along the leading axes are reduced by the partitioning).
Find Sequence Of Items: Dyad E.
Dyad E. has infinite rank and is used to slide a pattern across an array and look for positions at which the pattern matches the items of the array. x and y should have the same rank, and the sliding occurs along all axes of y, giving a Boolean result with the same shape as y . We will consider only the cases where y is a list.
'is' E. 'Mississippi'
0 1 0 0 1 0 0 0 0 0 0
The 1s in the result tell where the pattern starts. The result of E. is often used as input to u;.1 :
('is' E. 'Mississippi') <;.1 'Mississippi'
+---+-------+
|iss|issippi|
+---+-------+
A more ambitious example:
html =. 0 : 0
Press here to go back
Press here to go home
Press here to go away

)
('<a' E. html) {.@:(<@:(8&}.);._1)@:('>'&,);.1 html
+------------+------------+------------+
|'page1.html'|'page2.html'|'page3.html'|
+------------+------------+------------+
That looks like a useful result, but what a mess to produce it! If you want, you may try to understand that, but a better approach is to break it up:
extracthref =: <@:(8&}.) ;._1 @:('>'&,)
This seems understandable, with effort: the execution order is ((<@:(8&}.)) ;._1) @:('>'&,); we prepend '>' to y, then we use ;._1 on the string. That will make the prepended '>' the fret, and so we will break the string into parts that start with '>', throw away the first 8 characters of each part, and box each trimmed-down part. We can even try it on a test bit:
extracthref 'abcdefghijkl>xxx'
+----++
|ijkl||
+----++
Now we can look again at our original line, rewritten:
('<a' E. html) {.@:extracthref ;.1 html
+------------+------------+------------+
|'page1.html'|'page2.html'|'page3.html'|
+------------+------------+------------+
This makes some sense now. The execution order is ('<a' E. html) ({.@:extracthref ;.1) html . We use E. to find all the starting positions of '<a' tags; then, for each one, we split what follows the '', and then we take the first one, which will have the data before the '>' that matched the '<a' .
The left argument to the partitioning dyads u;.n can be a list of boxes. In this case the first box contains the partition marks for axis 0, then next box contains the marks for axis 1, and so on. If a set of partition marks is an empty list, the corresponding axis will be unpartitioned.
Dyad u;.0 has rank 2 _ . x u;.0 y uses x to specify a subarray of y; the subarray is extracted, and u is applied to it to produce the final result. We will discuss the simple case where x is a rank-2 array.
The first item of x (call that s) gives the starting corner of the subarray. The second item of x gives the length of each axis of the subarray. If x is shorter than the rank of y, unspecified axes are taken in full. The following examples use the test array a :
]a =. a. {~ (a. i. 'a') + i. 4 4
abcd
efgh
ijkl
mnop
A cute little expression in its own right. See why this produces the 4x4 array of characters shown. Remember that a. is the alphabet of all ASCII characters in order. An even more elegant way to produce the same result would be (i. 4 4)&+&.(a.&i.) 'a' .
(0 0 ,: 2 2) ];.0 a
ab
ef
Starting corner 0 0; lengths 2 2; result is a 2x2 subarray, left unchanged by monad ] .
(1 2 ,: 3 2) ];.0 a
gh
kl
op
Starting corner 1 2; lengths 3 2; result is a 3x2 subarray, left unchanged by monad ] . You get the idea.
If an item of s is negative, the negative index selects a starting point counting back from the end of the array, just as a negative index does in dyad { . The interval extends backwards from there:
(2 _1 ,: 2 2) ];.0 a
kl
op
Starting corner 2 _1 (the character 'l'); lengths 2 2, but running backward in axis 1; result is a 2x2 subarray, left unchanged by monad ] . Note that the axis extends backward, but the items retain their normal order--you have merely specified the interval by its endpoint rather than its beginning point. If you want to reverse the order of the axis, you can do that too, by making the corresponding length negative:
(2 _1 ,: 2 _2) ];.0 a
lk
po
Starting corner 2 _1 (the character 'l'); lengths 2 2, but running backward in axis 1; result is a 2x2 subarray with axis 1 reversed, left unchanged by monad ] .
The subarray must end at the limits of the array. If the length requests more than that, the subarray will be shorter than was requested. A length of _ or __ will always fetch from the starting point to the limit of the array.
Dyad u;.0 is a great way to pick out a subarray to work on. Always consider using it whenever you find yourself using more than one application of {.and }. to select a portion of an array. Even if you are working with a list, using dyad u;.0 is a good way to work on a portion of the list without copying any part you aren't working on.
Apply On All Subarrays: Dyad u;.3 and u;._3
x u;._3 y applies u to subarrays of y as specified by x . The operation is similar to dyad u\ (infix), but dyad u\ slides a one-dimensional window across y to select sequences of items of y, while dyad u;._3 moves a multidimensional window throughout y to select multidimensional regions. When y has only one dimension, the operation is like dyad u\ but with a little extra control over the positions of the window.
The second item of x (actually, | 1{x) gives the size of the window (if an item is negative the corresponding axis is reversed before u is applied to the window; an infinite value means 'take all the way to the end of the array'). The first item of x (0{x) is the movement vector: the window is positioned at every point at which each item of the window position is an integral multiple of the corresponding item of the movement vector, as long as the window fits inside y . If an item of the movement vector is smaller than the corresponding item of the size, the windows will overlap along that axis.
If the rank of y is greater than the length of an item of x (in other words if the window has lower rank than y), the omitted trailing dimensions have starting point 0 and length _ .
In all cases the verb u is applied to an array of cells in which the cells have the shape of the window and the frame of the array with respect to those cells has the rank of y .
Dyad u;._3 is useful in imaging applications. The following example averages 2x2-pixel regions in an image using a simple box filter:
]image =. ? 8 8 $ 100
31 88 65 15 68 38 38 49
14 58 84 59 95 55 14 98
40 14 56 25 48 46 96 12
19 31 62 12 65 62 80 24
47 38 20 2 90 42 14 94
41 13 88 9 16 7 36 25
13 78 45 34 45 80 93 65
21 67 90 25 86 47 50 60
(2 2,:2 2) (*&0.25)@:(+/)@:, ;._3 image
47.75 55.75 64 49.75
26 38.75 55.25 53
34.75 29.75 38.75 42.25
44.75 48.5 64.5 67
The rank of each operand presented to u is the same as the rank of y . The shape of each operand presented to u is the shape of y with the leading items replaced by |1{x (formally, this is (|1{x),(#x)}.$y).
If x has rank less than 2, it is processed as if it were 1,:x which will try the window at all possible locations.
x u;.3 y is similar to x u;._3 y, but the window is positioned at every starting point that is within y, even if the entire window will not fit within y . For those positions at which the window will not fit, the operand to u is truncated.
Extracting Variable-Length Fields Using ^:a: and ;.1
Breaking a string of variable-length fields into its individual fields seems to be a problem requiring a loop. How can you find the second field until you have examined the length of the first? There happens to be a good way to do this in loopless J. We will use as an example a set of character-string records where each record is preceded by a one-digit length (maximum string length is 9 characters). For example, the string
data =. '5There2is1a4tide2in3the7affairs2of3men'
contains 9 records, each containing a single English word. How do we split the string into its records?
First, we examine each possible starting position and calculate how long a record would be if it started at that position. The calculated length must be the entire record length including that of the length field itself. Obviously, we will be calculating spurious lengths at the places that turn out not to be record-start points, but that is the small price we pay for loopless coding. Here, the data length is given by the difference between the ASCII value of each byte and the ASCII value of '0', and we add one to account for the length of the length field:
]l =. >: (a. i. data) - a. i. '0'
6 37 57 54 67 54 3 58 68 2 50 5 69 58 53 54 3 ...
Next, we calculate, for each position, where the next record will start assuming that a record starts at that position. Clearly, we do this by adding the putative record length to the offset of the position. If the resulting total is past the end of the string, we limit the position to one character past the end of the string:
]n =. (#l) <. l + i. # l
6 38 38 38 38 38 9 38 38 11 ...
Now for the trick. The first record starts at offset 0. The next record starts at offset 0{n . The record after that starts at offset (0{n){n, and so on. To get the list of all the starting positions, we use
]pos =. (n,_1) {~^:a: 0
0 6 9 11 16 19 23 31 34 38 _1
The special power u^:a: means 'keep applying u until the result stops changing, and return the vector of results'. It is like u^:_ in that it applies u until the result stops changing, but u^:a: returns all the intermediate results from u, not just the last one. The result from {~^:a: is the list of start-of-record positions, and all that remains is to collect the records. We discard record pointers that are off the end, and box the records starting at the positions given. We do this by converting the list of valid record-start points to a Boolean vector, and using the partitioning functions to box the records:
((i. #data) e. pos) <;._1 data
+-----+--+-+----+--+---+-------+--+---+
|There|is|a|tide|in|the|affairs|of|men|
+-----+--+-+----+--+---+-------+--+---+
Example: Combining Adjacent Boxes
Sometimes the mapping of a problem into J is not obvious. Consider this problem: we have a list of boxes, each containing a set of positive numbers in a list. If the last item of one box equals the first item of the next, we want to join the two boxes, replacing them by a single box whose contents are all the unique items in both boxes. If a box is to be joined to both the previous and the following box, all three are to be combined into one box; generally, if there is a sequence of n boxes each to be joined to the next, those n boxes, plus the following box, are replaced by a single box containing all the unique items of the n+1 boxes.
For example, the input
]a =. 1 2;2 3;3 4;5 6;(,7);7 8 9;10
+---+---+---+---+-+-----+--+
|1 2|2 3|3 4|5 6|7|7 8 9|10|
+---+---+---+---+-+-----+--+
should produce the output
+-------+---+-----+--+
|1 2 3 4|5 6|7 8 9|10|
+-------+---+-----+--+
The trick is to see that this is a job for partitioning. Each group of boxes to be joined should be in a separate partition, and each box not to be joined should be in a partition by itself. Then, we just need a verb that will do the join if there are multiple boxes, and do nothing if there is only one box.
First, let's write that verb. We could do an explicit test, using the If conjunction ^: or the agenda conjunction @., but the simplest solution is the verb
<@:~.@:;
; runs together the contents of the boxes, ~. throws out any duplicates, and < puts the result in a single box. It does what we want whether it's given one box or many.
Next, we need to establish the partitions. We come up with the rule: if a box is not to be joined to the previous box, it starts a new partition. So in any string of boxes to be joined together, the first will start a partition and the others will not, with the result that they will all be in the same partition.
A box is not joined to the previous box if its first item is different from the previous box's last item (or if it is the first box). The first item of all boxes except the first is
}.@:({.@>) a
2 3 5 7 7 10
(we take the first item of each box and discard the first item of the result--make sure you know why we use {.@> rather than {.@:>, and also why }.@:{.@>, leaving out the parentheses, would fail but {.@>@}. would work [hint: it's all about rank]). The last item of all boxes except the last is
}:@:({:@>) a
2 3 4 6 7 9
We set the partition mask based on inequality of these two lists, add on a leading 1 for the first partition, and apply our joining verb to the partitions:
(1 , (}:@:({:@>) a) ~: (}.@:({.@>) a)) <@:~.@:; ;.1 a
+-------+---+-----+--+
|1 2 3 4|5 6|7 8 9|10|
+-------+---+-----+--+


| Features | Done by us |
|---|---|
| Users Modules | Implemented by Mean.js |
| Adverts Map | |
| Create Adverts View | |
| Adverts View | |
| Edit Adverts View | |
| Delete Adverts | |
| Advert Map Zoom | D3 documentation |
| Drag & Drop Zone | |
| Upload Files | Not implemented yet |
| Test server side with Mocha | |
| Test client side with Karma | |
| Test Shapes | Not implemented in this version |
| Heroku implementation |


A single directed edge consisting of a source id, target id, and the data associated with the edge.
Represents an edge along with its neighboring vertices and allows sending messages along the edge.
The direction of a directed edge relative to a vertex.
EdgeRDD[ED, VD]
extends RDD[Edge[ED]]
by storing the edges in columnar format on each
partition for performance.
An edge triplet represents an edge along with the vertex attributes of its neighboring vertices.
The Graph abstractly represents a graph with arbitrary objects associated with vertices and edges.
Contains additional functionality for Graph.
Integer identifer of a graph partition.
Integer identifer of a graph partition. Must be less than 2^30.
Represents the way edges are assigned to edge partitions based on their source and destination vertex IDs.
A 64-bit vertex identifier that uniquely identifies a vertex within a graph.
A 64-bit vertex identifier that uniquely identifies a vertex within a graph. It does not need to follow any ordering or any constraints other than uniqueness.
Extends RDD[(VertexId, VD)]
by ensuring that there is only one entry for each vertex and by
pre-indexing the entries for fast, efficient joins.
Registers GraphX classes with Kryo for improved performance.
A set of EdgeDirections.
The Graph object contains a collection of routines used to construct graphs from RDDs.
Provides utilities for loading Graphs from files.
Collection of built-in PartitionStrategy implementations.
Implements a Pregel-like bulk-synchronous message-passing API.
The VertexRDD singleton is used to construct VertexRDDs.
Various analytics functions for graphs.
Collections of utilities used by graphx.
ALPHA COMPONENT GraphX is a graph processing framework built on top of Spark.


The Psychic Game
Guess what letter I'm thinking of...
Wins:
Losses:
Guesses Left:
Your guesses so far:


Bouvetoya - Profile
Facts
- Bouvetoya (54°27.014' S, 03°18.05' E) (also known as Bouvet Island) is the most isolated island on earth. It lies 2000nm SSW of South Africa. It is a dependent territory of Norway.
- Glaciers cover 93% of the 54 sq km (21 sq mi) island and prevent landings on the south and east coasts, while steep cliffs as high as 490m (1607ft) block access to the north, west and southwest. Sometime between 1955 and 1958, a low-lying shelf of lava appeared on Bouvetoya's west coast, providing the only bird nesting site of any size on the island. The island is rarely visited.
- The island is not covered by the Antarctic Treaty.
It is useful to view this Norwegian website at www.npolar.no/en/regulations/the-antarctic/ for more information and to contact the Norwegian Polar Institute before planning to visit the island.
Last updated February 2016.
Weather
For links to free global weather information, forecast services and extreme weather information see the Noonsite Weather Page
Main Ports
* indicates port of entry


User Journals
How To
About
Contact
Sign In
Welcome
View Projects
Manage Components
Your Profile
Sign in
Your email
Please enter an email address.
×
Your password
Forgot Password?
Please enter your password.
×
Incorrect password.
×
Sign In


A statement about two numbers or quantities that are being compared.
The statement will tell you that they are not equal and which number or quantity is greater or smaller.
Special symbols are used to write about things that are equal (=), those that are greater than (>), or those that are less than (<) other things.
E.g. 8<9; 7>5; 12<15


etags(1) GNU Tools etags(1) NAME etags, ctags - generate tag file for Emacs, vi SYNOPSIS etags [-aCDGIRVh] [-i file] [-l language] [-o tagfile] [-r regexp] [--parse-stdin=file] [--append] [--no-defines] [--globals] [--no-globals] [--include=file] [--ignore-indentation] [--language=language] [--members] [--no-members] [--output=tagfile] [--regex=regexp] [--no-regex] [--help] [--version] file ... ctags [-aCdgIRVh] [-BtTuvwx] [-l language] [-o tagfile] [-r regexp] [--parse-stdin=file] [--append] [--backward-search] [--cxref] [--no-defines] [--globals] [--no-globals] [--ignore-indentation] [--language=language] [--members] [--no-members] [--output=tagfile] [--regex=regexp] [--update] [--help] [--version] file ... DESCRIPTION The etags program is used to create a tag table file, in a format under‐ stood by emacs(1); the ctags program is used to create a similar table in a format understood by vi(1). Both forms of the program understand the syntax of C, Objective C, C++, Java, Fortran, Ada, Cobol, Erlang, Forth, HTML, LaTeX, Emacs Lisp/Common Lisp, Lua, Makefile, Pascal, Perl, PHP, Postscript, Python, Prolog, Scheme and most assembler-like syntaxes. Both forms read the files specified on the command line, and write a tag table (defaults: TAGS for etags, tags for ctags) in the current working directory. Files specified with relative file names will be recorded in the tag table with file names relative to the directory where the tag ta‐ ble resides. If the tag table is in /dev or is the standard output, how‐ ever, the file names are made relative to the working directory. Files specified with absolute file names will be recorded with absolute file names. Files generated from a source file--like a C file generated from a source Cweb file--will be recorded with the name of the source file. Compressed files are supported using gzip and bzip2. The programs recog‐ nize the language used in an input file based on its file name and con‐ tents. The --language switch can be used to force parsing of the file names following the switch according to the given language, overriding guesses based on filename extensions. OPTIONS Some options make sense only for the vi style tag files produced by ctags; etags does not recognize them. The programs accept unambiguous abbreviations for long option names. -a, --append Append to existing tag file. (For vi-format tag files, see also --update.) -B, --backward-search Tag files written in the format expected by vi contain regular ex‐ pression search instructions; the -B option writes them using the delimiter `?', to search backwards through files. The default is to use the delimiter `/', to search forwards through files. Only ctags accepts this option. --declarations In C and derived languages, create tags for function declarations, and create tags for extern variables unless --no-globals is used. -D, --no-defines Do not create tag entries for C preprocessor constant definitions and enum constants. This may make the tags file much smaller if many header files are tagged. --globals Create tag entries for global variables in Perl and Makefile. This is the default in C and derived languages. --no-globals Do not tag global variables in C and derived languages. Typically this reduces the file size by one fourth. -i file, --include=file Include a note in the tag file indicating that, when searching for a tag, one should also consult the tags file file after checking the current file. Only etags accepts this option. -I, --ignore-indentation Don't rely on indentation as much as we normally do. Currently, this means not to assume that a closing brace in the first column is the final brace of a function or structure definition in C and C++. -l language, --language=language Parse the following files according to the given language. More than one such options may be intermixed with filenames. Use --help to get a list of the available languages and their default filename extensions. The `auto' language can be used to restore automatic detection of language based on the file name. The `none' language may be used to disable language parsing altogeth‐ er; only regexp matching is done in this case (see the --regex op‐ tion). --members Create tag entries for variables that are members of structure- like constructs in PHP. This is the default for C and derived languages. --no-members Do not tag member variables. --packages-only Only tag packages in Ada files. --parse-stdin=file May be used (only once) in place of a file name on the command line. etags will read from standard input and mark the produced tags as belonging to the file FILE. -o tagfile, --output=tagfile Explicit name of file for tag table; for etags only, a file name of - means standard output; overrides default TAGS or tags. (But ignored with -v or -x.) -r regexp, --regex=regexp Make tags based on regexp matching for the files following this option, in addition to the tags made with the standard parsing based on language. May be freely intermixed with filenames and the -R option. The regexps are cumulative, i.e. each such option will add to the previous ones. The regexps are of one of the forms: [{language}]/tagregexp/[nameregexp/]modifiers @regexfile where tagregexp is used to match the tag. It should not match useless characters. If the match is such that more characters than needed are unavoidably matched by tagregexp, it may be useful to add a nameregexp, to narrow down the tag scope. ctags ignores regexps without a nameregexp. The syntax of regexps is the same as in emacs. The following character escape sequences are sup‐ ported: \a, \b, \d, \e, \f, \n, \r, \t, \v, which respectively stand for the ASCII characters BEL, BS, DEL, ESC, FF, NL, CR, TAB, VT. The modifiers are a sequence of 0 or more characters among i, which means to ignore case when matching; m, which means that the tagregexp will be matched against the whole file contents at once, rather than line by line, and the matching sequence can match mul‐ tiple lines; and s, which implies m and means that the dot charac‐ ter in tagregexp matches the newline char as well. The separator, which is / in the examples, can be any character different from space, tab, braces and @. If the separator charac‐ ter is needed inside the regular expression, it must be quoted by preceding it with \. The optional {language} prefix means that the tag should be creat‐ ed only for files of language language, and ignored otherwise. This is particularly useful when storing many predefined regexps in a file. In its second form, regexfile is the name of a file that contains a number of arguments to the --regex= option, one per line. Lines beginning with a space or tab are assumed to be comments, and ig‐ nored. Here are some examples. All the regexps are quoted to protect them from shell interpretation. Tag the DEFVAR macros in the emacs source files: --regex='/[ \t]*DEFVAR_[A-Z_ \t(]+"\([^"]+\)"/' Tag VHDL files (this example is a single long line, broken here for formatting reasons): --language=none --regex='/[ \t]*\(ARCHITECTURE\|\ CONFIGURA‐ TION\) +[^ ]* +OF/' --regex='/[ \t]*\ \(ATTRIBUTE\|ENTITY\|FUNC‐ TION\|PACKAGE\( BODY\)?\ \|PROCE‐ DURE\|PROCESS\|TYPE\)[ \t]+\([^ \t(]+\)/\3/' Tag TCL files (this last example shows the usage of a tagregexp): --lang=none --regex='/proc[ \t]+\([^ \t]+\)/\1/' A regexp can be preceded by {lang}, thus restricting it to match lines of files of the specified language. Use etags --help to ob‐ tain a list of the recognized languages. This feature is particu‐ larly useful inside regex files. A regex file contains one regex per line. Empty lines, and those lines beginning with space or tab are ignored. Lines beginning with @ are references to regex files whose name follows the @ sign. Other lines are considered regular expressions like those following --regex. For example, the command etags<EMAIL_ADDRESS>*.c reads the regexes contained in the file regex.file. -R, --no-regex Don't do any more regexp matching on the following files. May be freely intermixed with filenames and the --regex option. -u, --update Update tag entries for files specified on command line, leaving tag entries for other files in place. Currently, this is imple‐ mented by deleting the existing entries for the given files and then rewriting the new entries at the end of the tags file. It is often faster to simply rebuild the entire tag file than to use this. Only ctags accepts this option. -v, --vgrind Instead of generating a tag file, write index (in vgrind format) to standard output. Only ctags accepts this option. -x, --cxref Instead of generating a tag file, write a cross reference (in cxref format) to standard output. Only ctags accepts this option. -h, -H, --help Print usage information. Followed by one or more --language=LANG prints detailed information about how tags are created for LANG. -V, --version Print the current version of the program (same as the version of the emacs etags is shipped with). SEE ALSO `emacs' entry in info; GNU Emacs Manual, Richard Stallman. cxref(1), emacs(1), vgrind(1), vi(1). COPYING Copyright (C) 1992, 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this doc‐ ument provided the copyright notice and this permission notice are pre‐ served on all copies. Permission is granted to copy and distribute modified versions of this document under the conditions for verbatim copying, provided that the en‐ tire resulting derived work is distributed under the terms of a permis‐ sion notice identical to this one. Permission is granted to copy and distribute translations of this docu‐ ment into another language, under the above conditions for modified ver‐ sions, except that this permission notice may be stated in a translation approved by the Free Software Foundation. GNU Tools 23nov2001 etags(1)


| 061:004 Khan | : |
Verily, Allah loves those who fight in His Cause in rows (ranks) as if they were a solid structure. |
| 061:004 Maulana | : |
Surely Allah loves those who fight in His way in ranks, as if they were a solid wall. |
| 061:004 Pickthal | : |
Lo! Allah loveth them who battle for His cause in ranks, as if they were a solid structure. |
| 061:004 Rashad | : |
GOD loves those who fight in His cause united in one column, like the bricks in one wall. |
| 061:004 Sarwar | : |
God loves those who fight for His cause in battlefield formations firm as an unbreakable concrete wall. |
| 061:004 Shakir | : |
Surely Allah loves those who fight in His way in ranks as if they were a firm and compact wall. |
| 061:004 Sherali | : |
Verily, ALLAH loves those who fight in HIS cause arrayed in solid ranks, as though they were a strong structure cemented with molten lead. |
| 061:004 Yusufali | : |
Truly Allah loves those who fight in His Cause in battle array, as if they were a solid cemented structure. |
Concepts/Themes Covered: أركان الإسلام > التوحيد > توحيد الله تعالي > حبه تعالى Pillars of Islam> Islamic> Oneness of Allah> His Love الجهاد > الجهاد في سبيل الإسلام > الدعوة إلى الجهاد Jihad> The Call to Jihad>The Call for the Holy War الجهاد > الجهاد في سبيل الإسلام > مدح الجهاد Jihad> The Call to Jihad>Praising the Holy War
This tool uses eight English parallel translations for the Holy Quran imported from Mr. Clay Smith. You can also visit Qurany Concepts for browsing the Quran themes or topics. If you want to search the Holy Quran for keywords, please visit Qurany Keywords.


Zetamind Consulting approaches every client’s business as if it were our own. We believe a consulting firm should be more than an advisor. We put ourselves in our clients’ shoes, align our incentives with their objectives, and collaborate to unlock the full potential of their business. This builds deep and enjoyable relationships.
The right approach is necessary for the right outcome. Zetamind Consulting approaches work by applying its external knowledge to your organization’s internal way of doing work. We know that in order to maximize the potential of success for your company we need to shape our expert advice in a way that applies to your way of doing business. This allows us to create rich relationships with our clients.
Armed with statistical knowledge, technical expertise, and fact based prediction, we allow your business to truly soar.
We help you shape and position your business services in a way that enhances the output of your clients.
We help companies dealing in consumer products create and present products that perfectly blend in with the zeitgeist.
Our financial experts help you analyze financial data, to create a rock steady financial foundation.
We work with energy companies to increase their efficiency and eliminate any environmentally harmful practices.
We are a company that offers design and build services for you from initial sketches to the final construction.


My Book Club
Edit Book "D":
Review:
Good!
Categories by all readers:
romance,history,Sci-fi
Categories by you:
Rating:
Please edit book
Review
Password
Log in
Return to the book list
Log Out


Purrfect Match
Home
About
Contact
Signup
Login
Purrfect Match
The Only Human-Feline Dating App
Get Started!