Chapter 19: Twitter in Twenty Minutes

Size: px
Start display at page:

Download "Chapter 19: Twitter in Twenty Minutes"

Transcription

1 Chapter 19: Twitter in Twenty Minutes In the last chapter, we learned how to create and query persistent data with App Engine and Google's Datastore. This chapter continues with that discussion by stepping through a simplified Twitter application. 1. App Specification Create Twitter 0.1. The application should allow any user to enter tweets and should display the tweets of all users. For this version, we'll ignore who enters the tweets and user accounts altogether. 2. Database Design Our database needs are simple: we need a database class for storing tweets. Each tweet should include the status message and the date and time it was entered. In the Customer example of last chapter, all of the fields were of type StringProperty. There are, however, a number of property (field) types defined in the Google's Datastore API. For a list, see typesandpropertyclasses.html. For our Tweet class, we need one StringProperty for the status message, and a DateTimeProperty for the date. Here's the class, which we'll define in a file named model.py: from google.appengine.ext import db class Tweet(db.Model): statusmessage = db.stringproperty(required=true) submissiontime = db.datetimeproperty(auto_now=true) Recall that defining such a db.model class just sets up the structure of our persisent data, performing a function analagous to the SQL create function which creates a database table. Later, we'll create actual records for the table in response to the user submitting an HTML form.

2 The 'required=true' parameter of the statusmessage StringProperty specifies that any tweet records created must have a non-empty value in this field. The 'auto_now=true' parameter of the DateTimeProperty tells the DataStore to automatically set the date on each tweet record stored. 3. The HTML Template We'll implement this version of Twitter with a single HTML template named index.html. The page needs a form for entering tweets, and a scripting code for loop that will unfold and show all of the previous tweets. Here it is: <!-- required: a template variable 'tweets' which is a list of objects --> <!-- each of which has statusmessage and submissiontime fields. --> <h2> What are you doing right now? </h2> <form action="/tweetsubmit" method="get"> <input type="text" name="status" value="status"> <input type="submit" value="submit"> </form> <br/><br/> <h2> Previous Tweets {% for tweet in tweets %} {{tweet.status}} <br/> {{tweet.submissiontime}} {% endfor %} The headers (h2s), breaks, and form are all standard HTML. The code within the double-curly brackets is scripting code using Django syntax, and specifies the dynamic part of this page. In this case, the dynamic part of the page is for displaying the previous tweets that have been entered. As set up, this page is expecting a list of Tweet records named tweets to be sent by the controllers that render this page. It also expects that each of the tweet records in the list will have fields for statusmessage and submissiontime. These requirements are specified at the top of file within an HTML comment (<! >). 4. The Config File The config file for this application is as simple as possible: application: dwtwitter version: 1

3 runtime: python api_version: 1 handlers: - url: /.* script: twitter_controller.py The only 'custom' parts of it are the application name dwtwitter, which must match the id we give the application when we register at appspot.com, and the name of the controller file, twitter_controller.py, where all of our controller code will be placed. 5. The Controller Our controller code is in twitter_controller.py, as specified in the config file. We need two event-handlers for this application, one to load the main page originally, and one that responds to the user entering a new tweet. Our first task is to specify the mappings between URL requests and the event-handlers we'll define. The two requests are "/" and "/tweetsubmit", the first pertaining to when the main page is loaded, the latter pertaining to the action defined within our HTML form for entering a tweet. Here is the mapping table we'll define near the bottom of the controller code: application = webapp.wsgiapplication( [ ('/', MainHandler), ('/tweetsubmit',tweetsubmithandler) ], debug=true) With those mappings defined, we are ready to define the event-handlers for our application. First, the MainHandler which will be called when the user first visits the site. Remember, all the handlers need to provide the HTML template with a single template variable named tweets which is a list of Tweet objects. Here's the code: class MainHandler(webapp.RequestHandler): tweetlist=db.gqlquery("select * from Tweets") template_values={'tweets':tweetlist} # render the page using the template engine path = os.path.join(os.path.dirname( file ),'index.html')

4 self.response.out.write(template.render(path,template_values)) The MainHandler just performs a query to get all of the previously entered Tweets. This variable is then inserted into the template_values with a key of 'tweets'. It is this key that must match the template variable in the HTML template: {% for tweet in tweets %} {{tweet.status}} <br/> {{tweet.submissiontime}} {% endfor %} Note that the variable 'tweet' in the HTML template is a place holder representing the currrent item in the list as it is traversed. So just 'tweets' and not 'tweet' correctly appears in the controller's template_values. The second handler needed is the TweetSubmitHandler. This handler will be called when the user clicks on the submit button of the form within the HTML: <form action="/tweetsubmit" method="get"> <input type="text" name="status" value="status"> <input type="submit" value="submit"> </form> If the user entered 'just chilling' in the text box, the following URL would be sent to the server: nameofsite.com/tweetsubmit?status='just chilling' The request is /tweetsubmit?status?'just chilling' The first part, /tweetsubmit, just causes the TweetSubmitHandler to be called due to our specification in the mapping table. When that handler is invoked, it can get to the request parameter status using function self.request.get. Here's the code for the event-handler: class TweetSubmitHandler(webapp.RequestHandler): status=self.request.get("status") twitter = Twitter() twitter.statusmessage=status twitter.put()

5 self.redirect('/') First, the handler gets the parameter named 'status' from the form parameters. If the user entered 'just chilling', that will be the value of the variable 'status'. It then creates a Twitter object, an instance of the database class we created near the top of this chapter. It then sets the 'statusmessage' field of the Twitter object to the variable status ('just chilling'). Finally, it calls 'put' to actually create the record in the database, and redirects to '/', which leads to the MainHandler being called again. That handler sets up our template_values with the previously entered tweets, including the one just entered.

6 Chapter 20: Account Management This chapter introduces the App Engine method for managing user accounts and user generated data in your applications. We continue with the Twitter example, and describe how to restrict the site to only validated users, how to keep track of each user's account information, and how to show each user only her tweets. Introduction If you use tools like Google Docs or Sites, you've probably signed on using a form like the following: With App Engine, you can easily create apps that manage user accounts in the same manner as these Google tools, including requiring that your users login with Google accounts, and having them sign in using the form shown above. App Engine provides this functionality with: The ability to specify, in the app.yaml configuration file, the pages of the site that should be password protected. Library code that provides easy access to the Google account information of your site visitors. You can use this information as is or write your own account objects that "wrap" the Google user objects and store additional information about your users.

7 Requiring Login In the app.yaml file, you specify how an application is configured, including how each request should be processed. Along with specifying the controller file, you can also state that a user must be logged in to access a page: handlers: - url: / script: app_controller.py - url: /.* script: app_controller.py login: required The first specification states that requests for the home page of the site ('/') should be dispatched to the controller code in app_controller.py, and that no login is required to visit that page. The second specifies that all other pages should also be dispatched to the same app_controller.py file, but that the user will have to login before visiting those pages. When a request arrives for login:required pages, the App Engine server first checks if the user is signed in with their Google account. If so, the controller code is invoked as usual. If not, the user is sent to Google's sign-in dialog, the one shown at the top of this chapter. If the user successfully logs in, the controller code is then invoked. Besides login:required, you can also specify pages that can only be accessed by site administrators with login:admin. Site administrators are the maintainers of the site, the ones behind the scenes who perform such operations as removing spam or blocking abusive users. For the programs you are writing, you are the one and only site administrator. The rules are the same as with the login:required pages, but App Engine will also check to see if the user logging in is an administrator of your site. You can specify administrators for your site in the site's dashboard at appspot.com-- just choose Developers in the left panel of the dashboard and you can send invites for collaborators. For more information about App Engine config files, see

8 Accessing User Information in the Controller Once a user has logged in to the application you can access her information- - Google nickname and -- using App Engine's users module. Specifically, you can call 'users.get_current_user' to access the currently signed in user. This function returns a user object, which has fields 'nickname' and ' '. Here's an example of controller code for accessing the user's information and putting it in the template_values for display: class SomeController(webapp.RequestHandler): user = users.get_current_user() nickname = user.nickname() template_values={'nickname':nickname} path = os.path.join(os.path.dirname( file ),'somepage.html') self.response.out.write(template.render(path,template_values)) For further information about the users module, see appengine/docs/python/users/userclass.html. Marking the Submitter in User-Generated Data Web 2.0 applications like Facebook and Twitter store data for the user, including profile information, bookmarks, notes, and other data commonly referred to as user-generated. For such data, the application must store a user id along with the information being stored. For instance, consider once again the Twitter application from the previous chapter, and specifically the Tweet database class: from google.appengine.ext import db class Tweet(db.Model): statusmessage = db.stringproperty(required=true) submissiontime = db.datetimeproperty(auto_now=true) As written, the class records the time of submission, but it doesn't record who submitted the status message (the tweet). Fortunately, App Engine provides a special class called a UserProperty for storing such information: from google.appengine.ext import db class Tweet(db.Model):

9 statusmessage = db.stringproperty(required=true) submissiontime = db.datetimeproperty(auto_now=true) submitter = db.userproperty() A UserProperty object can be set to the user that is returned from the library function 'users.get_current_user()'. App Engine doesn't actually store a copy of the user's information, just a key that can get us back to that information later. The addition to the TweetSubmit handler is quite simple: class TweetSubmitHandler(webapp.RequestHandler): user = users.get_current_user() status=self.request.get("status") twitter = Twitter() twitter.statusmessage=status twitter.submitter = user twitter.put() self.redirect('/') Now, each time a tweet is submitted, it is marked with the user who submitted it. This is of course essential for being able to list only a user's tweets, which we didn't do in the original Twitter sample (we showed the tweets from all users). Let's reconsider the MainHandler: class MainHandler(webapp.RequestHandler): tweetlist=db.gqlquery("select * from Tweets") template_values={'tweets':tweetlist} # render the page using the template engine path = os.path.join(os.path.dirname( file ),'index.html') self.response.out.write(template.render(path,template_values)) The query in this version of the handler selects all tweets, independent of who submitted them. We can modify this with by making use of the users.get_current_user() function and a Where clause in the query: class MainHandler(webapp.RequestHandler): user = users.get_current_user() tweetlist=db.gqlquery("select * from Tweets where submitter=:1",user)

10 template_values={'tweets':tweetlist} # render the page using the template engine path = os.path.join(os.path.dirname( file ),'index.html') self.response.out.write(template.render(path,template_values)) When the query is made, it will only return tweets which have a sumbitter field that matches the current user. Custom User Accounts The Google user account objects only provide fields for nickname and , and don't allow you to gather custom profile information about users. To track custom account information, you can "wrap" a Google UserProperty within a database class:: class Account(db.Model): first=db.stringproperty() last=db.stringproperty() user = db.userproperty() This class tracks a first and last name for each account, and links to the Google User account with the field user, which is defined as type UserProperty and points at a built-in Google user object. Because the Account class encloses Google user data along with additional data, it is termed a wrapper class. To make use of the Account class, you'll need to perform some bookkeeping when the user first logs into the application with her Google Account. In the MainHandler event-handler, you can check if the current Google user account object is associated with one of the wrapper Account objects. If it not, you just create a new Account instance in your event-handler, set it's fields, and store it in the database.you can set the user property to the value of 'users.current_user()' and, since you don't yet know the user's first and last name, set those to the default value of the Google nickname: # code within an event-handler user = users.get_current_user() # does this user already have an account? account = db.gql('select * from Account where user = :1',user) if not account: # no account exists yet for this user account= Account() account.user=user account.first=user.nickname() # or some other default value like ' '

11 account.last=user.nickname() account.put() # whether a new or existing account, send the user to profile page self.redirect('/profile?'+user.key()) # send them to the profile page With the call to 'redirect' in the sample, you can also immediately send the user to a profile page that allows her to set her first and last name (we'll show this later). Recording the Account with the Tweet Because you are now representing users with your Account objects instead of Google users directly, you'll need to modify the Tweet class to reference an account instead of a user: class Tweet (db.model): status=db.stringproperty() date = db.dateproperty(auto=true) submitter = db.userproperty() submitter = db.referenceproperty(account) You'll also need to modify the TweetSubmit controller: class TweetSubmitHandler(webapp.RequestHandler): user = users.get_current_user() accountquery = db.gqlquery('select * from Account where user=:1',user) account = accountquery.get() status=self.request.get("status") twitter = Twitter() twitter.statusmessage=status twitter.submitter = account twitter.put() self.redirect('/') Note that the db.gqlquery returns a query object, and not the result of the query. We can send a query directly in the template_values to a web page template to be processed, but sometimes we need to know the result(s) while still in the controller. In the above sample, this is the case as we want to set the submitter field of the just submitted tweet to the account. So we call get on the query, which returns the first, and in this case only, result. With this change, each tweet will now point to the additional information in the user's Account object. In our example, this additional information

12 includes the first and last name. You could also include information such as a profile image and thus show the user's picture with each tweet listing. Showing User Information with Tweets The tweetlist which our controller sends to the HTML template has all the information about the tweets, including a pointer to the submitter information. To show that information, we need only modify the HTML template. Here are the modifications: <!-- required: a template variable 'tweets' which is a list of objects --> <!-- each of which has statusmessage and submissiontime fields. --> <h2> What are you doing right now? </h2> <form action="/tweetsubmit" method="get"> <input type="text" name="status" value="status"> <input type="submit" value="submit"> </form> <br/><br/> <h2> Previous Tweets </h2> {% for tweet in tweets %} {{tweet.status}} <br/> {{tweet.submissiontime}} by&nbsp{{tweet.account.lastname}} {% endfor %} &nbsp is HTML for a blank space. tweet.account gives us an account object, which has the field lastname. Showing All Tweets or User Tweets Suppose that you want to allow the user to see either just her tweets, or tweets from all users, and for the latter you want to show the name of the submitter along with the tweet. Suppose also that you want the web page to provide links that let the user choose either my tweets or all tweets. First, you'll need to modify the HTML template to add links for the two choices. Here's the revised code: <!-- required: a template variable 'tweets' which is a list of objects - -> <!-- each of which has statusmessage and submissiontime fields. -- > <h2> What are you doing right now? </h2>

13 <form action="/tweetsubmit" method="get"> <input type="text" name="status" value="status"> <input type="submit" value="submit"> </form> <br/><br/> <h2> Previous Tweets {% for tweet in tweets %} {{tweet.status}} <br/> {{tweet.submissiontime}} by&nbsp{{tweet.account.lastname}} {% endfor %}<br/> <a href='/mytweets'>my Tweets</a>&nbsp <a href='/alltweets'>all Tweets</a> Links are specified with anchor tags and here the 'href' attribute is set to a request back to your server, not a full URL. The requests for the two links is 'mytweets' and 'alltweets' respectively. Second, you'll need to add handler mappings for '/mytweets' and '/alltweets' in the mapping table: application = webapp.wsgiapplication( [ ('/', MainHandler), ('/tweetsubmit',tweetsubmithandler), ('/mytweets', MainHandler), ('/alltweets', AllTweetHandler) ], debug=true) '/mytweets' is mapped to the MainHandler, since you've already modified that to show just the user's tweets. The 'alltweets' request will be handled by a new handler, AllTweetHandler. Here's the AllTweetHandler. It is the original MainHandler before we began considering users, and it uses a query with no Where clause: class AllTweetsHandler(webapp.RequestHandler): user = users.get_current_user() tweetlist=db.gqlquery("select * from Tweets") template_values={'tweets':tweetlist} # render the page using the template engine

14 path = os.path.join(os.path.dirname( file ),'index.html') self.response.out.write(template.render(path,template_values)) Adding Login and Logout Links to the App Sites that require login will have at least one page, accessible to anyone, that let's users see what the site is about. Your application will need to lead users from this page to Gogle's registration/login page. The users module provides a "create_login_url" function to get the URL for a Google login page. It also provides a "create_logout_url" function to allow users to logout. You can call both from your controller with code like the following: class OpenPageHandler(webapp.RequestHandler): user=users.get_current_user() if user: self.redirect('/profile?user='+user.key()) else: login_url=users.create_login_url(self.request.uri) logout_url=users.create_logout_url(self.request.uri) template_values={'login_url':login_url, 'logout_url':logout_url} # render the page using the template engine path = os.path.join(os.path.dirname( file ),'openpage.html') self.response.out.write(template.render(path,template_values)) In this example, if the user is already logged in, get_current_user returns an entry and the user is redirected to another page-- the home page for returning users of the system. If get_current_user returns Null, the current visitor is not a logged in user. In this case, create_login_url is called to get the URL for the Google login page. When create_login_url is called, you provide a parameter which is the URL that should be returned to once the user does login. In the sample above, this return URL is set to self.request.uri, so control will be returned to this controller code (this time with a non-null user entry). After obtaining the login_url and logout_url, the code above sticks them into a template_value. OpenPage.html can then display these links along with its other introductory information. Here's a sample HTML file with the links: <html> <body> <p> The purpose of this site is...</p> <a href={{login_url}}>login</a><br/> <a href={{logout_url}}>login</a><br/>

15 </body> </html> Note that there is also a 'create_logout_url' which, when clicked, logs a user out of the application. Both the login and logout_urls are often placed in the header and/or footer of each page. Profile Page Let's now consider the development of a user profile page. Knowing how to create them is important as they are common to most web 2.0 apps. Their development also is instructive in terms of some fundamental HTML and database issues. The profile page should display the user's information and allow them to edit it: To begin, we'll assume that each user can only view and edit their own profile page. Later, we'll consider a profile page that can be viewed by others. Let's begin with mapping the requests we'll need to controller eventhandlers. We'll need a request->handler that loads the profile page initially, and another for handling things when the user clicks on the submit button to update the info. Here are the additions to the mapping table: application = webapp.wsgiapplication( [ ('/', MainHandler), ('/tweetsubmit',tweetsubmithandler), ('/mytweets', MainHandler), ('/alltweets', AllTweetHandler) ('/profile',profilehandler) ('/ProfileSubmit',profileSubmitHandler) ], debug=true) The ProfileHandler controller just needs to get the current user's account object and place it into the template values so the profile.html template can

16 access it: class ProfileHandler(webapp.RequestHandler): user=users.get_current_user() query = db.gqlquery('select * from Account where user=:1',user) account=query.get() template_values={'account':account} # render the page using the template engine path = os.path.join(os.path.dirname( file ),'profile.html') self.response.out.write(template.render(path,template_values)) Next, let's consider the HTML template profile.html. Because we want the user to be able to view the existing account information, we'll set the value attribute of each text box in our form to a field of the template value 'account': <!-- account required as a template value --!> <form action="/profilesubmit" method="get"> First Name: <input type="text" name="first" value={{account.first}}><br/> Last Name:<input type="text" name="last" value={{account.last}}><br/> <input type="submit" value="submit"> </form> The data put into the value attribute appears in the text box when the form is rendered. So the current values of account.first and account.last will appear, as "David" and "Wolber" appeared in the form rendering above. When the user submits, we send the action '/profilesubmit' to the controller. Because of our mappings, profilesubmithandler is called. The job of this controller is to get the user's entries for the account fields and modify the account object in the database: class ProfileSubmitHandler(webapp.RequestHandler): user=users.get_current_user() query = db.gqlquery('select * from Account where user=:1',user) account=query.get() firstname = self.request.get('first') lastname = self.request.get('last') # modify the account object account.first=firstname account.last=lastname

17 account.put() self.redirect ('/profile') We query for the account object using the current user information. We then call self.requst.get to get the data from the input boxes. This data may be the same as what's in the database if the user didn't modify it. But we assume that its changed, modify the fields of the account object with the data from the form, and call put() to save the changes persistently in the database. Note that put() is used here as a database "update". In our previous code, put() was used to "insert" a new record in the database. The key difference is that here, put() was called on an object that was the result of a query-- an existing database record. In the tweet samples, we use the object creation statement: tweet= Tweet() to get a new recorde and then eventually call put to "insert" it into the database. A Public Profile Page The template page profile.html above shows the current user her information. There is no way for user X to view the page of user Y. Of course sometimes this is desired: for instance, if X is reading everyone's tweets and sees one from Y she likes, she may want to follow a link to view more information about Y. For this reason, most sites have some type of public profile page. A public profile page is different: it doesn't have a form, as no editing can take place. It also must be parameterized with a user id so it knows which user to display. With App Engine, every database class is given a field key which uniquely identifies each record. Even though the Account class has three fields listed: class Account(db.Model): first=db.stringproperty() last=db.stringproperty() user = db.userproperty() the system takes care of providing it with another field, key, which is a unique identifier.

18 This key can be used to send the publicprofile page a parameter that uniquely identifies which user to display. For instance, when tweets are listed, we can have the key of the submitter specified as a parameter to the publicprofile page: {% for tweet in tweets %} {{tweet.status}} <br/> {{tweet.submissiontime}} by <a href='publicprofile?key={{tweet.submitter.key}}'> {{tweet.submitter.last}}</a> {% endfor %}<br/> The anchor tag will show the submitter's last name and generate a request something like: publicprofile?key=734r when the link is clicked, the 734r being the key of the account who submitted that particular tweet. The mapping table must be updated to handle the publicprofile request: application = webapp.wsgiapplication( [ ('/', MainHandler), ('/tweetsubmit',tweetsubmithandler), ('/mytweets', MainHandler), ('/alltweets', AllTweetHandler) ('/profile',profilehandler) ('/ProfileSubmit',profileSubmitHandler) ('/publicprofile',publicprofilehandler) ], debug=true) and the PublicProfileHandler will access the account object using the key: class Public ProfileHandler(webapp.RequestHandler): user=users.get_current_user() query = db.gqlquery('select * from Account where user=:1',user) key = self.request.get('key') account=account.get(key) template_values={'account':account}

19 # render the page using the template engine path = os.path.join(os.path.dirname( file ),'publicprofile.html') self.response.out.write(template.render(path,template_values)) Here, self.request.get obtains the parameter key from the request URL. Each database class has a method get which accepts a key as a parameter. So Account.get(key) returns an account object with the given key. Given that we don't want the account information edited, we use a different HTML template file, publicprofile.html, to display the account information: <!-- account required as a template value --!> First Name: {{account.first}}<br/> Last Name: {{account.last}} Uploading Images Images can be displayed on a web page with the <img> tag, e.g., <img src='/images/birds.jpg' /> That code is sufficient for rendering static images that always appear on your pages. But what about images that are uploaded by a user? Such uploading is the very purpose of photo-sharing sites like Flickr, and is also common to Web 2.0 applications like Facebook which include pictures of all users. To handle such uploading, your site needs a form for allowing the user to choose a web image or one from their hard disk, and the uploaded files must be stored persistently on the server. Fortunately, App Engine provides some help for performing these common tasks. Storing Images Files can be stored in an AppEngine Database using the BlobProperty, which represents a bunch of bits. For instance, the following Account class stores a profile picture: class Account(db.Model): first=db.stringproperty() last=db.stringproperty() user = db.userproperty() profile_pic = db.blobproperty()

20 HTML forms allow for inputs of type "file". Such an input type prompts the user to choose a file with a dialog. For such forms, the enctype should be set to "multipart/form-data" and the method to "post", as the file might be large and "get" has limits on the number of bytes that can appear in the request. The following example let's the user choose an image file for their profile (and enter a first and last name): <!-- account required as a template value --!> <form action="/profilesubmit" enctype="multipart/form-data" method="post"> First Name: <input type="text" name="first" value={{account.first}}><br/> Last Name:<input type="text" name="last" value={{account.last}}><br/ Profile Picture: <input type="file" name="picfile"><br/> <input type="submit" value="submit"> </form> The ProfileSubmitHandler must be modified to get the file name entered by the user and create the Blob of the files bits: class ProfileSubmitHandler(webapp.RequestHandler): user=users.get_current_user() query = db.gqlquery('select * from Account where user=:1',user) account=query.get() firstname = self.request.get('first') lastname = self.request.get('last') pic = self.request.get("picfile") # modify the account object account.first=firstname account.last=lastname if pic: account.profile_pic = db.blob(pic) account.put() self.redirect ('/profile') Displaying Stored Images Images stored as blobs aren't loaded as static files, so you can't use the config file to catch requests for them and keep a controller event-handler from being called. Instead, you'll need controller code to serve the pictures from the blobs stored in the database, and you'll need a special request for

21 uploading images. An event-hanlder like the following will suffice: class ImageHandler (webapp.requesthandler): key=self.request.get('key') account = db.get(key) if account.profile_pic: self.response.headers['content-type'] = "image/png" self.response.out.write(account.profile_pic) else: self.error(404) and you'll need to add a mapping: application = webapp.wsgiapplication(... ('/loadimage',imagehandler) ], debug=true) The ImageHandler controller code expects the key of an account as a parameter. It uses that key to get the account object from the database. Note that the image we are showing might or might not be that of the current user. Thus we can't just get the account object from the current user. Given the account object, ImageHandler then grabs the saved blob in account.profile_pic, and writes that file directly to the browser. Note that the content-type must be set. Given such a request->handler, an HTML template can display an image with code like the following: <img src='loadimage?key={{account.key}}' alt='no image'></img> The src of 'loadimage' results in ImageHandler being called. {{account.key}} will return the account's key field as the parameter to the controller.

22 Summary Web 2.0 is a read-write web with the users being key agents in the process. This chapter has described methods for handling the user accounts and profiles of an application, and techniques for storing and processing usergenerated data like tweets.

Chapter 18: Persistence

Chapter 18: Persistence Chapter 18: Persistence This chapter introduces persistent data and methods for storing information in a file and database. You'll learn the basics of SQL and how App Engine lets you use objects to store

More information

App Engine Web App Framework

App Engine Web App Framework App Engine Web App Framework Jim Eng / Charles Severance jimeng@umich.edu / csev@umich.edu www.appenginelearn.com Textbook: Using Google App Engine, Charles Severance (Chapter 5) Unless otherwise noted,

More information

webapp2 Documentation

webapp2 Documentation webapp2 Documentation Release 3.0.0b1 Rodrigo Moraes Jun 20, 2017 Contents 1 Quick links 3 2 Status 5 3 Tutorials 7 4 Guide 31 5 API Reference - webapp2 57 6 API Reference - webapp2_extras 73 7 API Reference

More information

App Engine Web App Framework

App Engine Web App Framework App Engine Web App Framework Jim Eng / Charles Severance jimeng@umich.edu / csev@umich.edu www.appenginelearn.com Textbook: Using Google App Engine, Charles Severance (Chapter 5) Unless otherwise noted,

More information

CS4HS Using Google App Engine. Michael Parker

CS4HS Using Google App Engine. Michael Parker CS4HS Using Google App Engine Michael Parker (michael.g.parker@gmail.com) So what is it? What's it for? Building and running web applications Why use it? Handles serving web pages, efficiently storing

More information

Form Processing in PHP

Form Processing in PHP Form Processing in PHP Forms Forms are special components which allow your site visitors to supply various information on the HTML page. We have previously talked about creating HTML forms. Forms typically

More information

Rapid Development with Django and App Engine. Guido van Rossum May 28, 2008

Rapid Development with Django and App Engine. Guido van Rossum May 28, 2008 Rapid Development with Django and App Engine Guido van Rossum May 28, 2008 Talk Overview This is not a plug for Python, Django or Google App Engine Except implicitly :) Best practices for using Django

More information

Google App Engine Data Store. Google is BIG. Advanced Stuff.

Google App Engine Data Store. Google is BIG. Advanced Stuff. Google App Engine Data Store ae-10-datastore Unless otherwise noted, the content of this course material is licensed under a Creative Commons Attribution 3.0 License. http://creativecommons.org/licenses/by/3.0/.

More information

CS2021- Week 10 Models and Views. Model, View, Controller. Web Development Model, Views, Controller Templates Databases

CS2021- Week 10 Models and Views. Model, View, Controller. Web Development Model, Views, Controller Templates Databases CS2021- Week 10 Models and Views Web Development Model, Views, Controller Templates Databases Model, View, Controller The MVC pa@ern is simple and very useful in web development. MVC pa@ern forces one

More information

BEGINNER PHP Table of Contents

BEGINNER PHP Table of Contents Table of Contents 4 5 6 7 8 9 0 Introduction Getting Setup Your first PHP webpage Working with text Talking to the user Comparison & If statements If & Else Cleaning up the game Remembering values Finishing

More information

Google & the Cloud. GData, Mashup Editor, AppEngine. Gregor Hohpe Software Engineer Google, Inc. All rights reserved,

Google & the Cloud. GData, Mashup Editor, AppEngine. Gregor Hohpe Software Engineer Google, Inc. All rights reserved, Google & the Cloud GData, Mashup Editor, AppEngine Gregor Hohpe Software Engineer www.eaipatterns.com 2008 Google, Inc. All rights reserved, 2008 Google, Inc. All rights reserved, 2 1 Web 2.0 From the

More information

How to Claim Your GIAC Digital Badge

How to Claim Your GIAC Digital Badge How to Claim Your GIAC Digital Badge 2019 2. CONTENTS Page # Information 3-8 9-13 Utilizing Your Email Invitation To Claim Your GIAC Digital Badge Claiming Your Digital Badge From Your SANS Account 14-16

More information

CS193X: Web Programming Fundamentals

CS193X: Web Programming Fundamentals CS193X: Web Programming Fundamentals Spring 2017 Victoria Kirst (vrk@stanford.edu) Schedule Today: - Fetch - JSON - Fetch in an class - Querying REST APIs - Form submission - HW4 out! GitHub repo for today's

More information

NETB 329 Lecture 13 Python CGI Programming

NETB 329 Lecture 13 Python CGI Programming NETB 329 Lecture 13 Python CGI Programming 1 of 83 What is CGI? The Common Gateway Interface, or CGI, is a set of standards that define how information is exchanged between the web server and a custom

More information

Interactive Web Application

Interactive Web Application Interactive Web Application This lesson builds on previous lessons With this lesson we will be picking up right where we left off from our Node.js Hosting lesson. The presentation can be found at http://rockymountaincoding.org.

More information

Hons. B.Sc. Degree in Software Engineering/Development. Web and Cloud Development

Hons. B.Sc. Degree in Software Engineering/Development. Web and Cloud Development Hons. B.Sc. Degree in Software Engineering/Development Web and Cloud Development Summer 2012 Instructions to candidates: Answer any four questions all questions carry equal marks. Start your answer at

More information

Developing Online Databases and Serving Biological Research Data

Developing Online Databases and Serving Biological Research Data Developing Online Databases and Serving Biological Research Data 1 Last Time HTML Hypertext Markup Language Used to build web pages Static, and can't change the way it presents itself based off of user

More information

Building Python web app on GAE

Building Python web app on GAE Building Python web app on GAE tw3gsucks, a 3G network speed test web app. PyHUG Tsai, Shih-Chang 2011/12/21 It all starts with... 3G network is really SUCKS!!! I'm used to live in a connected world! Bad

More information

ABSOLUTE FORM PROCESSOR ADMINISTRATION OPTIONS

ABSOLUTE FORM PROCESSOR ADMINISTRATION OPTIONS ABSOLUTE FORM PROCESSOR ADMINISTRATION OPTIONS The Absolute Form Processor is very easy to use. In order to operate the system, you just need the menu at the top of the screen. There, you ll find all the

More information

Draft 1, Ch. 1-3, Spring '09

Draft 1, Ch. 1-3, Spring '09 Draft 1, Ch. 1-3, Spring '09 Table of Contents Chapter 1: Introduction... 3 Computer Science and Cloud Computing... 4 Chapter 2: How the Web Works... 6 Servers... 6 Static Web Pages... 7 URLs, IPs, and

More information

Developing Ajax Applications using EWD and Python. Tutorial: Part 2

Developing Ajax Applications using EWD and Python. Tutorial: Part 2 Developing Ajax Applications using EWD and Python Tutorial: Part 2 Chapter 1: A Logon Form Introduction This second part of our tutorial on developing Ajax applications using EWD and Python will carry

More information

Google GCP-Solution Architects Exam

Google GCP-Solution Architects Exam Volume: 90 Questions Question: 1 Regarding memcache which of the options is an ideal use case? A. Caching data that isn't accessed often B. Caching data that is written more than it's read C. Caching important

More information

Access your page by hovering over your campus and then choosing Staff Directory. Click on your name to enter your page.

Access your page by hovering over your campus and then choosing Staff Directory. Click on your name to enter your page. LOGIN TO THE WEBSITE Go to www.earlyisd.net and find the Login icon near the top of the page. NOTE: You can find the Login icon on any page of the EISD website. Enter your username (school email address)

More information

212Posters Instructions

212Posters Instructions 212Posters Instructions The 212Posters is a web based application which provides the end user the ability to format and post content, abstracts, posters, and documents in the form of pre-defined layouts.

More information

Kentico CMS Web Parts

Kentico CMS Web Parts Kentico CMS Web Parts Abuse report Abuse report In-line abuse report Articles Article list BizForms BizForm (on-line form) Blogs Comment view Recent posts Post archive Blogs comments viewer New blog Blog

More information

COM1004 Web and Internet Technology

COM1004 Web and Internet Technology COM1004 Web and Internet Technology When a user submits a web form, how do we save the information to a database? How do we retrieve that data later? ID NAME EMAIL MESSAGE TIMESTAMP 1 Mike mike@dcs Hi

More information

Navigating Your CrowdRise Dashboard Team Member Guide

Navigating Your CrowdRise Dashboard Team Member Guide Navigating Your CrowdRise Dashboard Team Member Guide Once you have set up a fundraising page and added some pictures, it s time to explore more options available on your Dashboard. Step 1 - Log in to

More information

Building Production Quality Apps on App Engine. Ken Ashcraft 5/29/2008

Building Production Quality Apps on App Engine. Ken Ashcraft 5/29/2008 Building Production Quality Apps on App Engine Ken Ashcraft 5/29/2008 Outline Writing code for production Testing performance Safe deployment after launch 3 Writing Code for Production Writing Code for

More information

Understanding the Dumper Program Google Application Engine University of Michigan Informatics

Understanding the Dumper Program Google Application Engine University of Michigan Informatics UnderstandingtheDumperProgram GoogleApplicationEngine UniversityofMichigan Informatics Thishandoutdescribesaverysimpleandlow levelgoogleapplicationengine applicationcalled Dumper thatjustdumpsoutthedatafromahttprequest.

More information

PYTHON CGI PROGRAMMING

PYTHON CGI PROGRAMMING PYTHON CGI PROGRAMMING http://www.tutorialspoint.com/python/python_cgi_programming.htm Copyright tutorialspoint.com The Common Gateway Interface, or CGI, is a set of standards that define how information

More information

Creating a Custom TinyWebDB service

Creating a Custom TinyWebDB service Creating a Custom TinyWebDB service 1. TinyWebDB is an App Inventor component that allows you to store data persistently in a database on the web. Because the data is stored on the web instead of a particular

More information

Islamic University of Gaza Faculty of Engineering Department of Computer Engineering ECOM Advanced Internet Technology Lab.

Islamic University of Gaza Faculty of Engineering Department of Computer Engineering ECOM Advanced Internet Technology Lab. Islamic University of Gaza Faculty of Engineering Department of Computer Engineering ECOM 5049 Advanced Internet Technology Lab Lab # 1 Eng. Haneen El-masry February, 2015 Objective To be familiar with

More information

Website/Blog Admin Using WordPress

Website/Blog Admin Using WordPress Website/Blog Admin Using WordPress Table of Contents How to login... 2 How to get support... 2 About the WordPress dashboard... 3 WordPress pages vs posts... 3 How to add a new blog post... 5 How to edit

More information

Mail Merge for Gmail v2.0

Mail Merge for Gmail v2.0 The Mail Merge with HTML Mail program will help you send personalized email messages in bulk using your Gmail account. What can Mail Merge for Gmail do? You can send messages in rich HTML, the message

More information

Firespring Analytics

Firespring Analytics Firespring Analytics What do my website statistics mean? To answer this question, let's first consider how a web page is loaded. You've just typed in the address of a web page and hit go. Depending on

More information

Google Groups. Using, joining, creating, and sharing. content with groups. What's Google Groups? About Google Groups and Google Contacts

Google Groups. Using, joining, creating, and sharing. content with groups. What's Google Groups? About Google Groups and Google Contacts Google Groups Using, joining, creating, and sharing content with groups What's Google Groups? Google Groups is a feature of Google Apps that makes it easy to communicate and collaborate with groups of

More information

Introduction to Databases and SQL

Introduction to Databases and SQL Introduction to Databases and SQL Files vs Databases In the last chapter you learned how your PHP scripts can use external files to store and retrieve data. Although files do a great job in many circumstances,

More information

HTML Element A pair of tags and the content these include are known as an element

HTML Element A pair of tags and the content these include are known as an element HTML Tags HTML tags are used to mark-up HTML elements. HTML tags are surrounded by the two characters < and >. The surrounding characters are called angle brackets HTML tags are not case sensitive,

More information

If you re a Facebook marketer, you re likely always looking for ways to

If you re a Facebook marketer, you re likely always looking for ways to Chapter 1: Custom Apps for Fan Page Timelines In This Chapter Using apps for Facebook marketing Extending the Facebook experience Discovering iframes, Application Pages, and Canvas Pages Finding out what

More information

(Refer Slide Time: 01:40)

(Refer Slide Time: 01:40) Internet Technology Prof. Indranil Sengupta Department of Computer Science and Engineering Indian Institute of Technology, Kharagpur Lecture No #25 Javascript Part I Today will be talking about a language

More information

No matter where I am or whose computer I am using, as long as I have Internet access, I can mange my Google Docs account. Even from my cell phone!

No matter where I am or whose computer I am using, as long as I have Internet access, I can mange my Google Docs account. Even from my cell phone! Using Google Docs By Dick Evans www.rwevans.com No matter where I am or whose computer I am using, as long as I have Internet access, I can mange my Google Docs account. Even from my cell phone! All my

More information

Placester Quick Start Guide

Placester Quick Start Guide Placester Quick Start Guide Congratulations! You re on your way to building a strong online presence for your real estate business. This Quick Start Guide will walk you through all of the basics for getting

More information

c360 Web Connect Configuration Guide Microsoft Dynamics CRM 2011 compatible c360 Solutions, Inc. c360 Solutions

c360 Web Connect Configuration Guide Microsoft Dynamics CRM 2011 compatible c360 Solutions, Inc.   c360 Solutions c360 Web Connect Configuration Guide Microsoft Dynamics CRM 2011 compatible c360 Solutions, Inc. www.c360.com c360 Solutions Contents Overview... 3 Web Connect Configuration... 4 Implementing Web Connect...

More information

Outline. Introducing Form. Introducing Forms 2/21/2013 INTRODUCTION TO WEB DEVELOPMENT AND HTML

Outline. Introducing Form. Introducing Forms 2/21/2013 INTRODUCTION TO WEB DEVELOPMENT AND HTML Outline INTRODUCTION TO WEB DEVELOPMENT AND HTML Introducing Forms The element Focus Sending form data to the server Exercise Lecture 07: Forms - Spring 2013 Introducing Form Any form is declared

More information

Blogging using Wordpress

Blogging using Wordpress Blogging using Wordpress 5 th February 2014 ilqam By Mohd Ali Mohd Isa 2 Blogging with wordpress INTRODUCTION Wordpress is a free blogging platform that can be accessed from anywhere over the Internet.

More information

Austin Community College Google Apps Groups Step-by-Step Guide

Austin Community College Google Apps Groups Step-by-Step Guide The topics that will be covered in this workshop: Three Options (p.2) Creating a Group (p.3) Ø Option #1 (p.3) i. Access Levels (p. 4) ii. Add Members (p. 5) Ø Option #2 (p.6) Groups (p.7) Search (p.7)

More information

1 Form Basics CSC309

1 Form Basics CSC309 1 Form Basics Web Data 2! Most interesting web pages revolve around data! examples: Google, IMDB, Digg, Facebook, YouTube! can take many formats: text, HTML, XML, multimedia! Many of them allow us to access

More information

Hello everyone! Page 1. Your folder should look like this. To start with Run your XAMPP app and start your Apache and MySQL.

Hello everyone! Page 1. Your folder should look like this. To start with Run your XAMPP app and start your Apache and MySQL. Hello everyone! Welcome to our PHP + MySQL (Easy to learn) E.T.L. free online course Hope you have installed your XAMPP? And you have created your forms inside the studio file in the htdocs folder using

More information

Using web-based

Using web-based Using web-based Email 1. When you want to send a letter to a friend you write it, put it in an envelope, stamp it and put it in the post box. From there the postman picks it up, takes it to a sorting office

More information

WordPress is free and open source, meaning it's developed by the people who use it.

WordPress is free and open source, meaning it's developed by the people who use it. 1 2 WordPress Workshop by BBC July 2015 Contents: lorem ipsum dolor sit amet. page + WordPress.com is a cloudhosted service that runs WordPress where you can set up your own free blog or website without

More information

Chapter 7: The Internet

Chapter 7: The Internet CSE1520.03 Glade Manual Chapter 7: The Internet Objectives This chapter introduces you to creating a web page that can be viewed on the Internet using a web browser such Firefox, Safari, Chrome or Internet

More information

Lecture 6: More Arrays & HTML Forms. CS 383 Web Development II Monday, February 12, 2018

Lecture 6: More Arrays & HTML Forms. CS 383 Web Development II Monday, February 12, 2018 Lecture 6: More Arrays & HTML Forms CS 383 Web Development II Monday, February 12, 2018 Lambdas You may have encountered a lambda (sometimes called anonymous functions) in other programming languages The

More information

Get feedback by using Voice of the Customer surveys Install the Voice of the Customer solution Plan a survey Design a basic survey Distribute a

Get feedback by using Voice of the Customer surveys Install the Voice of the Customer solution Plan a survey Design a basic survey Distribute a Table of Contents Get feedback by using Voice of the Customer surveys Install the Voice of the Customer solution Plan a survey Design a basic survey Distribute a survey Design an advanced survey Analyze

More information

SocialMiner Configuration

SocialMiner Configuration This section outlines the initial setup that must be performed when SocialMiner is first installed as well as the ongoing user-configurable options that can be used once the system is up and running. The

More information

Q1. What is JavaScript?

Q1. What is JavaScript? Q1. What is JavaScript? JavaScript was designed to add interactivity to HTML pages JavaScript is a scripting language A scripting language is a lightweight programming language JavaScript is usually embedded

More information

CMS Editing SomersetYFC.co.uk

CMS Editing SomersetYFC.co.uk CMS Editing SomersetYFC.co.uk General notes 1. You may find it useful to print out these notes and add your login details to the space below. 2. CMS stands for Content Management System. 3. Please use

More information

CS50 Quiz Review. November 13, 2017

CS50 Quiz Review. November 13, 2017 CS50 Quiz Review November 13, 2017 Info http://docs.cs50.net/2017/fall/quiz/about.html 48-hour window in which to take the quiz. You should require much less than that; expect an appropriately-scaled down

More information

Master Syndication Gateway V2. User's Manual. Copyright Bontrager Connection LLC

Master Syndication Gateway V2. User's Manual. Copyright Bontrager Connection LLC Master Syndication Gateway V2 User's Manual Copyright 2005-2006 Bontrager Connection LLC 1 Introduction This document is formatted for A4 printer paper. A version formatted for letter size printer paper

More information

Web Focused Programming With PHP

Web Focused Programming With PHP Web Focused Programming With PHP May 20 2014 Thomas Beebe Advanced DataTools Corp (tom@advancedatatools.com) Tom Beebe Tom is a Senior Database Consultant and has been with Advanced DataTools for over

More information

By the end of this section of the practical, the students should be able to:

By the end of this section of the practical, the students should be able to: By the end of this section of the practical, the students should be able to: Learn about the Document Object Model and the Document Object Model hierarchy Create and use the properties, methods and event

More information

HTTP. EC512 Spring /15/2015 EC512 - Prof. Thomas Skinner 1

HTTP. EC512 Spring /15/2015 EC512 - Prof. Thomas Skinner 1 HTTP EC512 Spring 2015 2/15/2015 EC512 - Prof. Thomas Skinner 1 HTTP HTTP is the standard protocol used between a web browser and a web server. It is standardized by the World Wide Web Consortium, W3C

More information

Client Side JavaScript and AJAX

Client Side JavaScript and AJAX Client Side JavaScript and AJAX Client side javascript is JavaScript that runs in the browsers of people using your site. So far all the JavaScript code we've written runs on our node.js server. This is

More information

How to Use Google. Sign in to your Chromebook. Let s get started: The sign-in screen. https://www.youtube.com/watch?v=ncnswv70qgg

How to Use Google. Sign in to your Chromebook. Let s get started: The sign-in screen. https://www.youtube.com/watch?v=ncnswv70qgg How to Use Google Sign in to your Chromebook https://www.youtube.com/watch?v=ncnswv70qgg Use a Google Account to sign in to your Chromebook. A Google Account lets you access all of Google s web services

More information

HTML Forms. By Jaroslav Mohapl

HTML Forms. By Jaroslav Mohapl HTML Forms By Jaroslav Mohapl Abstract How to write an HTML form, create control buttons, a text input and a text area. How to input data from a list of items, a drop down list, and a list box. Simply

More information

SQL Deluxe 2.0 User Guide

SQL Deluxe 2.0 User Guide Page 1 Introduction... 3 Installation... 3 Upgrading an existing installation... 3 Licensing... 3 Standard Edition... 3 Enterprise Edition... 3 Enterprise Edition w/ Source... 4 Module Settings... 4 Force

More information

PHP 5 if...else...elseif Statements

PHP 5 if...else...elseif Statements PHP 5 if...else...elseif Statements Conditional statements are used to perform different actions based on different conditions. PHP Conditional Statements Very often when you write code, you want to perform

More information

Creating and Sharing a Google Calendar

Creating and Sharing a Google Calendar Creating and Sharing a Google Calendar How to Create a Google Calendar You can only create new calendars on a browser on your computer or mobile device. Once the calendar is created, you'll be able to

More information

CMPT 165 INTRODUCTION TO THE INTERNET AND THE WORLD WIDE WEB

CMPT 165 INTRODUCTION TO THE INTERNET AND THE WORLD WIDE WEB CMPT 165 INTRODUCTION TO THE INTERNET AND THE WORLD WIDE WEB Unit 8 HTML Forms and Basic CGI Slides based on course material SFU Icons their respective owners 1 Learning Objectives In this unit you will

More information

CGI Architecture Diagram. Web browser takes response from web server and displays either the received file or error message.

CGI Architecture Diagram. Web browser takes response from web server and displays either the received file or error message. What is CGI? The Common Gateway Interface (CGI) is a set of standards that define how information is exchanged between the web server and a custom script. is a standard for external gateway programs to

More information

How To Change My Wordpress Database

How To Change My Wordpress Database How To Change My Wordpress Database Password On Instagram Account Built by one of the world's largest Instagram browsers INK361, this comprehensive widget that can showcase your Instagram account in the

More information

Privacy and Security in Online Social Networks Department of Computer Science and Engineering Indian Institute of Technology, Madras

Privacy and Security in Online Social Networks Department of Computer Science and Engineering Indian Institute of Technology, Madras Privacy and Security in Online Social Networks Department of Computer Science and Engineering Indian Institute of Technology, Madras Lecture 08 Tutorial 2, Part 2, Facebook API (Refer Slide Time: 00:12)

More information

PIC 40A. Lecture 19: PHP Form handling, session variables and regular expressions. Copyright 2011 Jukka Virtanen UCLA 1 05/25/12

PIC 40A. Lecture 19: PHP Form handling, session variables and regular expressions. Copyright 2011 Jukka Virtanen UCLA 1 05/25/12 PIC 40A Lecture 19: PHP Form handling, session variables and regular expressions 05/25/12 Copyright 2011 Jukka Virtanen UCLA 1 How does a browser communicate with a program on a server? By submitting an

More information

Zendesk Instructions for End-Users

Zendesk Instructions for End-Users Zendesk Instructions for End-Users Ver. 1.00 July, 2013 Ver. 1.00 July, 2013 Zendesk Instructions for End-Users Getting Started Registering & Logging in to Zendesk To submit and then track your support

More information

web.py Tutorial Tom Kelliher, CS 317 This tutorial is the tutorial from the web.py web site, with a few revisions for our local environment.

web.py Tutorial Tom Kelliher, CS 317 This tutorial is the tutorial from the web.py web site, with a few revisions for our local environment. web.py Tutorial Tom Kelliher, CS 317 1 Acknowledgment This tutorial is the tutorial from the web.py web site, with a few revisions for our local environment. 2 Starting So you know Python and want to make

More information

Amazon Mechanical Turk. Requester UI Guide API Version

Amazon Mechanical Turk. Requester UI Guide API Version Amazon Mechanical Turk Requester UI Guide Amazon Mechanical Turk: Requester UI Guide Copyright 2011 Amazon Web Services LLC or its affiliates. All rights reserved. Table of Contents Welcome... 1 Introduction

More information

Getting Help...71 Getting help with ScreenSteps...72

Getting Help...71 Getting help with ScreenSteps...72 GETTING STARTED Table of Contents Onboarding Guides... 3 Evaluating ScreenSteps--Welcome... 4 Evaluating ScreenSteps--Part 1: Create 3 Manuals... 6 Evaluating ScreenSteps--Part 2: Customize Your Knowledge

More information

CERTIFICATE IN WEB PROGRAMMING

CERTIFICATE IN WEB PROGRAMMING COURSE DURATION: 6 MONTHS CONTENTS : CERTIFICATE IN WEB PROGRAMMING 1. PROGRAMMING IN C and C++ Language 2. HTML/CSS and JavaScript 3. PHP and MySQL 4. Project on Development of Web Application 1. PROGRAMMING

More information

Geocaching HTML & BBCode FUNdamentals by Scott Aleckson (SSO JOAT)

Geocaching HTML & BBCode FUNdamentals by Scott Aleckson (SSO JOAT) Geocaching HTML & BBCode FUNdamentals by Scott Aleckson (SSO JOAT) Anchorage BP Energy Center & Broadcast over the Internet via WebEx 18 September 2012 1 Tonight s Topics: Computer Languages What is HTML?

More information

Lecture 9a: Sessions and Cookies

Lecture 9a: Sessions and Cookies CS 655 / 441 Fall 2007 Lecture 9a: Sessions and Cookies 1 Review: Structure of a Web Application On every interchange between client and server, server must: Parse request. Look up session state and global

More information

Questionnaire 4.0 User Manual 2006/4/14

Questionnaire 4.0 User Manual 2006/4/14 Email Questionnaire 4.0 User Manual 2006/4/14 Introduction Email Questionnaire is an interactive email survey system. Unlike other on-line questionnaire systems that need a web server to construct, distribute

More information

Web-based Apps in.net

Web-based Apps in.net Web-based Apps in.net Objectives Real-world applications are typically multi-tier, distributed designs involving many components the web server being perhaps the most important component in today's applications...

More information

Admin Center. Getting Started Guide

Admin Center. Getting Started Guide Admin Center Getting Started Guide Useful Links Create an Account Help Center Admin Center Agent Workspace Supervisor Dashboard Reporting Customer Support Chat with us Tweet us: @Bold360 Submit a ticket

More information

FREETOASTHOST WEBSITE INSTRUCTIONS

FREETOASTHOST WEBSITE INSTRUCTIONS FREETOASTHOST WEBSITE INSTRUCTIONS Contents LOGIN AS SITE ADMINISTRATOR... 2 CHANGING THE COLOR SCHEME OF YOUR WEBSITE... 4 UPLOADING A PHOTO TO YOUR HOME PAGE... 5 UPLOADING FILES TO YOUR PUBLIC DOWNLOADS

More information

FROM 4D WRITE TO 4D WRITE PRO INTRODUCTION. Presented by: Achim W. Peschke

FROM 4D WRITE TO 4D WRITE PRO INTRODUCTION. Presented by: Achim W. Peschke 4 D S U M M I T 2 0 1 8 FROM 4D WRITE TO 4D WRITE PRO Presented by: Achim W. Peschke INTRODUCTION In this session we will talk to you about the new 4D Write Pro. I think in between everyone knows what

More information

Table of Contents

Table of Contents Table of Contents Introduction License What is Gophish? Installation Getting Started Documentation Changing User Settings Groups Templates Landing Pages Sending Profiles Campaigns Using the API Reporting

More information

<form>. input elements. </form>

<form>. input elements. </form> CS 183 4/8/2010 A form is an area that can contain form elements. Form elements are elements that allow the user to enter information (like text fields, text area fields, drop-down menus, radio buttons,

More information

Privacy and Security in Online Social Networks Department of Computer Science and Engineering Indian Institute of Technology, Madras

Privacy and Security in Online Social Networks Department of Computer Science and Engineering Indian Institute of Technology, Madras Privacy and Security in Online Social Networks Department of Computer Science and Engineering Indian Institute of Technology, Madras Lecture 07 Tutorial 2 Part 1 Facebook API Hi everyone, welcome to the

More information

Autoresponder Guide. David Sharpe

Autoresponder Guide. David Sharpe David Sharpe There are two autoresponders that I personally use and recommended AWeber and Sendlane. AWeber AWeber is a great service to use if you already have a website you are using. You can easily

More information

BrainCert Enterprise LMS. Learning Management System (LMS) documentation Administrator Guide Version 3.0

BrainCert Enterprise LMS. Learning Management System (LMS) documentation Administrator Guide Version 3.0 BrainCert Enterprise LMS Learning Management System (LMS) documentation Administrator Guide Version 3.0 1 P a g e Table of Contents... 3... 3... 4... 4... 5... 5... 6... 6... 8... 8... 9... 9... 10...

More information

Connecture Platform Manager

Connecture Platform Manager Connecture Platform Manager 1 P a g e Table of Contents Connecture Platform Manager... 1 Introduction to the Connecture Platform Manager... 3 Getting Started... 3 Login... 3 Dashboard... 3 Connecture Application

More information

External HTML E-form Guide

External HTML E-form Guide External HTML E-form Guide A guide for creation and setup of external e- froms for FileBound. Document Version: 6.5.2 Published Date: 2/27/2014 - 2 - Copyright Copyright 2013 FileBound All Rights Reserved.

More information

CHAPTER 2 MARKUP LANGUAGES: XHTML 1.0

CHAPTER 2 MARKUP LANGUAGES: XHTML 1.0 WEB TECHNOLOGIES A COMPUTER SCIENCE PERSPECTIVE CHAPTER 2 MARKUP LANGUAGES: XHTML 1.0 Modified by Ahmed Sallam Based on original slides by Jeffrey C. Jackson reserved. 0-13-185603-0 HTML HELLO WORLD! Document

More information

By Ryan Stevenson. Guidebook #2 HTML

By Ryan Stevenson. Guidebook #2 HTML By Ryan Stevenson Guidebook #2 HTML Table of Contents 1. HTML Terminology & Links 2. HTML Image Tags 3. HTML Lists 4. Text Styling 5. Inline & Block Elements 6. HTML Tables 7. HTML Forms HTML Terminology

More information

CS2021-Week 9 - Forms. HTML Forms. Python Web Development. h?ps://www.udacity.com/wiki/ cs253/unit-2html. Form for Submitting input:

CS2021-Week 9 - Forms. HTML Forms. Python Web Development. h?ps://www.udacity.com/wiki/ cs253/unit-2html. Form for Submitting input: CS2021-Week 9 - Forms Python Web Development HTML Forms h?ps://www.udacity.com/wiki/ cs253/unit-2html Form for Submitting input: Web Application:

More information

Google Sites 101. Mrs. Wilson

Google Sites 101. Mrs. Wilson Google Sites 101 Mrs. Wilson Google Sites 101 Create a site 1. Go to http://sites.google.com/ 2. Login with your Google Account [or Google Apps account] email address and password You can create a Google

More information

Google Docs Website (Sign in or create an account):

Google Docs Website (Sign in or create an account): What is Google Docs? Google Docs is a free online word processor, spreadsheet, and presentation editor that allows you to create, store, share, and collaborate on documents with others. Create and share

More information

WEBSITE INSTRUCTIONS

WEBSITE INSTRUCTIONS Table of Contents WEBSITE INSTRUCTIONS 1. How to edit your website 2. Kigo Plugin 2.1. Initial Setup 2.2. Data sync 2.3. General 2.4. Property & Search Settings 2.5. Slideshow 2.6. Take me live 2.7. Advanced

More information

How to use the Molecular Workbench (MW) authoring environment to modify an existing activity.

How to use the Molecular Workbench (MW) authoring environment to modify an existing activity. ADAPTING AN ACTIVITY - MAKING IT YOUR OWN How to use the Molecular Workbench (MW) authoring environment to modify an existing activity. Many Molecular Workbench activities can be easily altered by teachers

More information

Book IX. Developing Applications Rapidly

Book IX. Developing Applications Rapidly Book IX Developing Applications Rapidly Contents at a Glance Chapter 1: Building Master and Detail Pages Chapter 2: Creating Search and Results Pages Chapter 3: Building Record Insert Pages Chapter 4:

More information

Get Started with Sites

Get Started with Sites DN:GA-GSS_101.00 Get Started with Sites Accessing Sites and creating, editing, and sharing a site Access Sites To create a new site and to view a list of sites that you own or can edit: Directly visit

More information