[google-appengine] Are Weekly Discounted Instance Hours still a thing?

2014-04-16 Thread n8gray
Looking at my billing it looks like my reserved weekly discounted instance 
hours aren't being figured in any way.  Is this because all instance hours 
are now the same price and there's no need for reserved hours?  Why is 
there still a setting for reserving hours?  Am I crazy or has all 
documentation of this stuff vanished too?

I dropped my reserved hours down to 0 since there's no price difference, 
but I'd like to know if there's still some reason to use them.

Thanks
-n8


-- 
You received this message because you are subscribed to the Google Groups 
Google App Engine group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to google-appengine+unsubscr...@googlegroups.com.
To post to this group, send email to google-appengine@googlegroups.com.
Visit this group at http://groups.google.com/group/google-appengine.
For more options, visit https://groups.google.com/d/optout.


[google-appengine] Re: Outgoing bandwidth explosion

2012-01-06 Thread n8gray
No, nothing like that.  The app is a backend for an iPhone game that
doesn't use blobstore or allow uploads at all.

Thanks,
-Nathan

On Jan 6, 4:38 am, Andrin von Rechenberg and...@miumeet.com wrote:
 Maybe you have user uploaded hot-linked images that are served from
 blobstore?
 Do you have any UGC? For an evil guy there is nothing more interesting than
 hosting
 porn images on the blazing fast GAE infrastructure with you paying for it.

 I really wish one could disabling hot linking of blobstore images.

 Cheers,
 -Andrin







 On Fri, Jan 6, 2012 at 8:40 AM, n8gray n8g...@gmail.com wrote:
  Hi,

  I've got an app that I've had running for a long time now and its
  resource usage is highly predictable.  The app consistently uses about
  60-70MB outgoing bandwidth per day.  But today the dashboard tells me
  it's used over 2GB!  When I look at the bytes sent/sec graph for the
  last 7 days there's no difference between today and any other day.  In
  fact, all of my plots look typical.  I tried searching my logs for
  bytes:[1-9]\d{5,10} and got nothing -- there were no huge requests.
  What's going on here??

  Thanks,
  -Nathan

  --
  You received this message because you are subscribed to the Google Groups
  Google App Engine group.
  To post to this group, send email to google-appengine@googlegroups.com.
  To unsubscribe from this group, send email to
  google-appengine+unsubscr...@googlegroups.com.
  For more options, visit this group at
 http://groups.google.com/group/google-appengine?hl=en.

-- 
You received this message because you are subscribed to the Google Groups 
Google App Engine group.
To post to this group, send email to google-appengine@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en.



[google-appengine] Outgoing bandwidth explosion

2012-01-05 Thread n8gray
Hi,

I've got an app that I've had running for a long time now and its
resource usage is highly predictable.  The app consistently uses about
60-70MB outgoing bandwidth per day.  But today the dashboard tells me
it's used over 2GB!  When I look at the bytes sent/sec graph for the
last 7 days there's no difference between today and any other day.  In
fact, all of my plots look typical.  I tried searching my logs for
bytes:[1-9]\d{5,10} and got nothing -- there were no huge requests.
What's going on here??

Thanks,
-Nathan

-- 
You received this message because you are subscribed to the Google Groups 
Google App Engine group.
To post to this group, send email to google-appengine@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en.



Re: [google-appengine] Re: email sent by GAE would be regarded as spam for some email services

2011-04-16 Thread n8gray
Ikai,

I totally understand that you guys want to focus on the interesting parts of 
the problem, but you could make one really simple change that would probably 
*solve* the problem for most of your users: allow us to set the DKIM header 
on outgoing mail.  All it would require is allowing write access to one more 
header.

See this bug for details:
http://code.google.com/p/googleappengine/issues/detail?id=3161

Cheers,
-n8

-- 
You received this message because you are subscribed to the Google Groups 
Google App Engine group.
To post to this group, send email to google-appengine@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en.



[google-appengine] Re: Please help! App Engine mail marked as spam.

2010-07-31 Thread n8gray
Thanks from me as well.  I updated my record, but I'm pretty sure my
messages were already getting a pass on SPF.  I'll see if it helps
with Yahoo.

Cheers,
-n8

On Jul 31, 4:59 am, Greg g.fawc...@gmail.com wrote:
 Thanks Onestone - I've updated my SPF records and my messages now get
 an SPF pass instead of neutral. It'll be interesting to see how much
 this improves email delivery.

 On Jul 30, 12:49 am, Onestone onest...@gmail.com wrote:



  Look here:
 http://www.kyle-jensen.com/increase-email-deliverability-on-appengine-by

-- 
You received this message because you are subscribed to the Google Groups 
Google App Engine group.
To post to this group, send email to google-appeng...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en.



[google-appengine] Static images not being served

2010-06-21 Thread n8gray
Hi all,

My static images aren't being served.  I've got this in my app.yaml
file:

handlers:
# Static
- url: /html
  static_dir: html

- url: /css
  static_dir: css

- url: /images
  static_dir: images

... and so on.  My static html and css files are served without
problems, but my image files are not.  They do appear to be uploaded,
since if I change nothing but a single image then redeploy, one file
gets uploaded.

For an example of a broken image on a page, see:
http://playhexalex.appspot.com/actions/test

Thanks for any help, and please CC me with replies.
-n8

-- 
You received this message because you are subscribed to the Google Groups 
Google App Engine group.
To post to this group, send email to google-appeng...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en.



[google-appengine] Re: Static images not being served

2010-06-21 Thread n8gray
On Jun 21, 12:51 pm, n8gray n8g...@gmail.com wrote:
 Hi all,

 My static images aren't being served.
 ...
 Thanks for any help, and please CC me with replies.

Ok, sorry for replying to myself, but just after posting this I tried
renaming my image file from HexaLex-logo.png to logo.png, and that
solved the problem.  I'm guessing the '-' is the problem.  That's
gotta be a bug in GAE, right?

Thanks,
-n8

-- 
You received this message because you are subscribed to the Google Groups 
Google App Engine group.
To post to this group, send email to google-appeng...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en.



[google-appengine] Re: Globally monotonic counter

2009-07-23 Thread n8gray

Hi Nick,

Wow, that's impressive!  That's a very useful bit of information.  Are
memcache writes guaranteed ordered wrt datastore writes as well, or is
it possible for another part of the system to see them in different
orders?

Cheers,
-n8

On Jul 22, 9:56 am, Nick Johnson (Google) nick.john...@google.com
wrote:
 Hi n8gray,

 The Datastore is strongly consistent. As such, all processes will see
 changes happen in the same order, even across entity groups - and at
 any one point in time, all processes will have a consistent view of
 the datastore.

--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
Google App Engine group.
To post to this group, send email to google-appengine@googlegroups.com
To unsubscribe from this group, send email to 
google-appengine+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en
-~--~~~~--~~--~--~---



[google-appengine] Re: Globally monotonic counter

2009-07-23 Thread n8gray

On Jul 23, 3:18 pm, Nick Johnson (Google) nick.john...@google.com
wrote:

 Memcache is also strongly consistent. Since both APIs are synchronous, by
 the time your API call returns, the changes are visible everywhere - so a
 datastore write followed by a memcache write will be seen in that order
 everywhere. There's no guarantee of atomicity across the two, though, so you
 need to assume that either or both operations could fail independently.

Ah, I had no idea those APIs were synchronous!  In fact, I assumed
that writes would be asynchronous.  That makes things much easier.  It
would be good to mention that in the documentation for those
subsystems.

Cheers,
-n8

--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
Google App Engine group.
To post to this group, send email to google-appengine@googlegroups.com
To unsubscribe from this group, send email to 
google-appengine+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en
-~--~~~~--~~--~--~---



[google-appengine] Re: Globally monotonic counter

2009-07-17 Thread n8gray

On Jul 16, 10:35 pm, Andy Freeman ana...@earthlink.net wrote:
                                               I'm starting to think that the 
  GAE takes
  care of the messy details of distributed systems programming claim is
  a bit overstated...

 Global clock consistency requires very expensive clocks accessible
 from every server with known latency (and even that's a bit dodgy).
 AFAIK, GAE doesn't provide that, but who does?

 GAE doesn't do the impossible, but also doesn't say that it does.  WRT
 the latter, would you really prefer otherwise?

But that's just it -- in many places it's claimed that GAE makes it
all a cakewalk.  From the datastore docs:


Storing data in a scalable web application can be tricky. A user could
be interacting with any of dozens of web servers at a given time, and
the user's next request could go to a different web server than the
one that handled the previous request. All web servers need to be
interacting with data that is also spread out across dozens of
machines, possibly in different locations around the world.

Thanks to Google App Engine, you don't have to worry about any of
that. App Engine's infrastructure takes care of all of the
distribution, replication and load balancing of data behind a simple
API—and you get a powerful query engine and transactions as well.


You could argue that that's not claiming to do the impossible, but
you don't have to worry about any of that is certainly not true.
Nowhere in the documentation is there a discussion of the kinds of
subtle gotchas that you need to be aware of when programming for this
kind of system.  It's all just golly isn't this so gosh-darn easy!
You have to go digging to find the article on transaction isolation
where you find out that your queries can return results that, um,
don't match your queries.  And AFAICT you *do* have to worry about
subsequent requests being handled by different servers, since there
doesn't seem to be any guarantee that the datastore writes made in one
request will be seen in the next.  Memcache doesn't have transactions,
so it seems like guaranteeing coherence with the datastore is tricky.

I worked in a distributed systems group for many years, so I know that
many of these problems are simply inherent to distributed systems.  It
doesn't disturb me that they exist.  What bothers me is the way these
issues are broadly *ignored* by GAE's documentation.  If I wasn't a
bit savvy about distributed systems I probably wouldn't have realized
that clock skew could cause problems, and nothing I read in GAE's docs
would have helped me figure it out.  So no, I don't want GAE to claim
to do the impossible, I want them to *stop* claiming to do the
impossible.  I would love to see some articles about the pitfalls of
the system and how to avoid them or mitigate them.  The transaction
isolation article is great in that respect -- I hope people at Google
are planning more along those lines.

Cheers,
-n8

--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
Google App Engine group.
To post to this group, send email to google-appengine@googlegroups.com
To unsubscribe from this group, send email to 
google-appengine+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en
-~--~~~~--~~--~--~---



[google-appengine] Re: Globally monotonic counter

2009-07-17 Thread n8gray

On Jul 17, 8:29 am, Andy Freeman ana...@earthlink.net wrote:
 You're mis-parsing the sentence.  Note that they even tell you what
 they mean by take care of messy details.

 Let's look at another example.  MS's Visual {whatever} documentation
 claims that it makes programming easy.  Do you think that that claim
 implies that using said product will let anyone produce an O(N)
 solution to an NP-complete problem?

I'm sorry, but you don't have to worry about any of that right after
a description of a massively distributed database is a much stronger,
more specific statement than your strawman, and it's also demonstrably
untrue.

   I worked in a distributed systems group for many years, so I know that
  many of these problems are simply inherent to distributed systems.  It
  doesn't disturb me that they exist.

 You're complaining that GAE doesn't solve them.

Where, specifically?  You seem to be reacting to this statement:


I'm starting to think that the GAE takes care of the messy details of
distributed systems programming claim is a bit overstated...


You may notice that I'm criticizing GAE's advertising, not its
implementation.

Cheers,
-n8

--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
Google App Engine group.
To post to this group, send email to google-appengine@googlegroups.com
To unsubscribe from this group, send email to 
google-appengine+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en
-~--~~~~--~~--~--~---



[google-appengine] Re: Globally monotonic counter

2009-07-16 Thread n8gray

Thanks for the advice, Nick.  I'd still like to know more about the
consistency model though.  For example, I wonder if there's any
guarantee that two transactions on different entity groups executed by
one process in a given order will be observed in the same order.  I
suspect the answer is no.  I'm starting to think that the GAE takes
care of the messy details of distributed systems programming claim is
a bit overstated...

Cheers,
-n8

On Jul 14, 2:27 am, Nick Johnson (Google) nick.john...@google.com
wrote:
 Hi Nathan,

 Your best options are either to keep track of one event stream per
 game, or to use system time, and 'rewind' the timestamp a bit to
 capture any missed events, as you suggest. Global monotonic counters
 aren't very practical in large distributed systems.

 -Nick Johnson

--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
Google App Engine group.
To post to this group, send email to google-appengine@googlegroups.com
To unsubscribe from this group, send email to 
google-appengine+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en
-~--~~~~--~~--~--~---



[google-appengine] Re: Globally monotonic counter

2009-07-14 Thread n8gray

Hi Albert,

Thanks for the suggestion.  I think I can live without uniqueness as
long as timestamps don't go backwards.  But I think my problem still
exists with a sharded counter.  Having a counter is certainly better
than using datetime.utcnow() and lets me assign an order to all events
that have been generated, but that's not really the problem.  The
tricky part is deciding, on the client end, which events to request
based on the events you've received.  When the client asks for all
events after time T it gets some last event with a new timestamp
S.  But I don't think you can trust this S because there might be some
other event in some corner of GAE with an earlier timestamp that
hasn't yet been observed by the server that answered the client's
request.

I guess the root of the problem is that I know that transactions on
entity groups give me the ACID properties but when it comes to
operations outside of transactions I have no idea what the consistency
model is.  Has this been described somewhere?

Thanks,
-n8

On Jul 13, 7:06 pm, Albert albertpa...@gmail.com wrote:
 Hi!

 This is a quick suggestion.

 How about using a global counter (just like your title suggests). You
 can use a sharded global counter to facilitate your counting.

 And use that counter as a timestamp / bookmark.

 On every event, you read from the global counter, use that value as
 your timestamp, and then increment the global counter.

 I'm not sure of it's implications, though. I'm not also sure if it
 actually guarantees uniqueness of timestamps when two events happen
 almost at the same time.

 Perhaps you can get an idea from this.

 Enjoy!
--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
Google App Engine group.
To post to this group, send email to google-appengine@googlegroups.com
To unsubscribe from this group, send email to 
google-appengine+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en
-~--~~~~--~~--~--~---



[google-appengine] Finding out if a key is in the datastore

2009-06-15 Thread n8gray

Hi folks,

Is there a way to find out if a key refers to an entity in the
datastore without retrieving it?  Something like myKey.exists() would
be nice, but I don't see it in the docs.
--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
Google App Engine group.
To post to this group, send email to google-appengine@googlegroups.com
To unsubscribe from this group, send email to 
google-appengine+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en
-~--~~~~--~~--~--~---



[google-appengine] Re: DB design best practices

2009-06-11 Thread n8gray

On Jun 10, 5:21 pm, Tony fatd...@gmail.com wrote:
 The biggest question I wished I'd asked myself before designing my app
 is: what sorts of models will I want to update together in
 transactions?  Because in Datastore you can only run transactions on
 entities in the same entity group (meaning each entity is an ancestor/
 child of the others).  So if you need certain operations to maintain
 consistency, for instance add new Turn entity, update Game's
 current_player you will need to plan that ahead of time (perhaps
 assigning each Turn as a child of the Game it takes place in).

Right, I came to the same conclusion.  The game's state is the only
super-entity that needs to be updated atomically, so I decided to
group it together.

 Other than that, just remember that writing to Datastore is very
 expensive (as is fetching large numbers of entities from a query) -
 you will want to figure out ways to retrieve entities by key as much
 as possible.

I'll keep that in mind.  It would be nice to have some rule of thumb
advice on when and how to use memcache.

Thanks,
-n8
--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
Google App Engine group.
To post to this group, send email to google-appengine@googlegroups.com
To unsubscribe from this group, send email to 
google-appengine+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en
-~--~~~~--~~--~--~---



[google-appengine] Re: DB design best practices

2009-06-11 Thread n8gray

Hi Nick,

On Jun 11, 4:19 am, Nick Johnson (Google) nick.john...@google.com
wrote:
 Hi n8gray,

 Excellent question!

 Given the amount of information you're likely to store against Players2Games
 (GamePlayers, perhaps?), and the number of games any one player may have,
 and the likely access patterns, I would suggest sticking with a separate
 model for it.

Interesting -- I came to the opposite conclusion but maybe my
reasoning isn't sound.  Here's what I've got right now (untested, so
it may contain syntax errors and such):

class GameState(VersionedModel):
# Parent should be a GameMeta
scores = db.ListProperty(int)
other gritty details of the current game state

class GameTurn(VersionedModel):
# Parent should be a GameMeta
creationDate = db.DateTimeProperty(auto_now_add=True)
player = db.ReferenceProperty(User)
turn_score = db.IntegerProperty()
more gritty details about this turn

This is the stuff you only care about if you're currently playing the
game.  The scores may be better placed in GameMeta -- I haven't
decided yet.

class GameMeta(VersionedModel):
name = db.StringProperty(required=True)
password = db.StringProperty(indexed=False)
creationDate = db.DateTimeProperty(auto_now_add=True)
isActive = db.BooleanProperty(default=True)
# In case of tie, there can be more than one winner
winners = db.ListProperty(db.Key, default=None)
playerCount = db.IntegerProperty(required=True)
currentPlayer = db.ReferenceProperty(User, required=True)
currentPlayerNumber = db.IntegerProperty(default=0)
gameState = db.ReferenceProperty(GameState)
players = db.ListProperty(db.Key)

GameMeta holds all the metadata of the game.  I moved the players list
in here (despite watching Brett Slatkin's I/O talk on list properties)
because I reasoned that a) the serialization/deserialization overhead
for 4 elements wouldn't be too bad, and b) You're going to want the
player list every time you retrieve the game anyway.  If you think
this is unwise, however, I'm interested to hear why.


 The main lesson for using the datastore instead of a relational database is
 simply to denormalize and precalculate. In this case, that likely means
 storing running totals (number of turns, score, etc) against the
 Players2Games entity, instead of calculating them when needed as you might
 in a relational database.

Yeah, I was planning to do a fair bit of denormalization.

 Tony's point about entity groups is an excellent one. Based on the sort of
 updates you're likely to want to do, and the access patterns in an app like
 this, I would suggest making the Players2Games entities child entities of
 the related Games entity, and making the Turns entities likewise child
 entities of their Games entity. This way, each game has its own entity
 group, so you can make atomic (transactional) updates across the whole game
 with ease.

At least I got that part right!

Thanks,
-n8

--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
Google App Engine group.
To post to this group, send email to google-appengine@googlegroups.com
To unsubscribe from this group, send email to 
google-appengine+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en
-~--~~~~--~~--~--~---



[google-appengine] DB design best practices

2009-06-10 Thread n8gray

Hi everybody,

I'm about to start working on an AppEngine backend for an iPhone game
I'm developing.  It's a simple board game, with 2-4 players who each
take turns making plays.  Originally I had planned to set up a LAMP
server for my project, but AE has changed my plans (for the better!).
I've never written database code before but I've read up on the basics
of database design, and I came to the conclusion that I would need a
DB schema with tables something like this:

Players:  username, email, userid, ...
Games: gameid, time_started, current_player, is_finished, ...
Players2Games:  userid, gameid, score, ...
Turns: userid, gameid, timestamp, turn_number, play, turn_score, ...

It seems clear, however, that Datastore is not a traditional database
and perhaps my schema needs to be revisited.  Is it still necessary or
advisable to use a table like Players2Games in order to represent many-
to-many relationships?  What should my roots and parent/child
relationships be?

Typical queries will be (unsurprising) things like:
get all games for player x
get all players for game x
get the scores of all players in game x
get any turns in game x that have occurred since time t

Any advice, or pointers to articles/posts/documentation are
appreciated!

Thanks,
-n8

--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
Google App Engine group.
To post to this group, send email to google-appengine@googlegroups.com
To unsubscribe from this group, send email to 
google-appengine+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en
-~--~~~~--~~--~--~---