text:
International Baccalaureate Diploma Programme
Lalaji Memorial Omega International School is an authorised school to run International Baccalaureate Diploma Programme and is listed under IB World School by IBO. IB World schools share a common philosophy—a commitment to high quality, challenging international education that Lalaji Memorial Omega International School believes is important for the students.
The International Baccalaureate aims to develop inquiring, knowledgeable and caring young people who help to create a better and more peaceful world through intercultural understanding and respect.
To this end the organization works with schools, governments and international organizations to develop challenging programmes of international education and rigorous assessment.
These programmes encourage students across the world to become active, compassionate and lifelong learners who understand that other people, with their differences, can also be right.
The IB Diploma Programme (DP) is an academically challenging and balanced programme of education with final examinations that prepares students, aged 16 to 19, for success at university and life beyond. It has been designed to address the intellectual, social, emotional and physical well-being of students. The programme, has gained recognition and respect from the world's leading universities.
The Diploma Programme prepares students for effective participation in a rapidly evolving and increasingly global society as they:
- develop physically, intellectually, emotionally and ethically
- acquire breadth and depth of knowledge and understanding, studying courses from 6 subject groups
- develop the skills and a positive attitude toward learning that will prepare them for higher education
- study at least two languages and increase understanding of cultures, including their own
- make connections across traditional academic disciplines and explore the nature of knowledge through the programme's unique theory of knowledge course
- undertake in-depth research into an area of interest through the lens of one or more academic disciplines in the extended essay
- enhance their personal and interpersonal development through creativity, activity and service.
The Curriculum
IB Diploma Programme students must choose one subject from each of five groups (1 to 5), ensuring breadth of knowledge and understanding in their best language, additional language(s), the social sciences, the experimental sciences and mathematics. Candidates to choose 1 subject each from groups 1-5and 1 more subject from groups 3,4 or 6. Of these students may take at least 3 or a maximum of 4 at Higher Level and a minimum of 2 or a maximum of 3 at Standard Level.
Choice of subjects offered at LMOIS
- Group 1 - Language A : English language and Literature SL / HL
- Group 2 - Language B : Second language offered at two levels
- Ab initio - German, French and Spanish
- SL- German, French, Spanish and Hindi .
- Group 3 - Business and Management HL/SL, Economics HL/SL, Information Technology in a global society HL/SL (additional Subject), Psychology HL/SL, Environmental Systems and societies SL
- Group 4 - Physics HL/SL, Chemistry HL/SL, Biology HL/SL (additional subject), Computer Science, Environmental Systems and societies SL
- Group 5 – Mathematical Studies, Mathematics HL/SL
- Group 6 - Visual Arts SL
Students take written examinations at the end of the programme, which are marked by external IB examiners. Students also complete assessment tasks in the school, which are either initially marked by teachers and then moderated by external moderators or sent directly to external examiners.
The marks awarded for each course range from 1 (lowest) to 7 (highest). Students can also be awarded up to three additional points for their combined results on theory of knowledge and the extended essay. The diploma is awarded to students who gain at least 24 points, subject to certain minimum levels of performance across the whole programme and to satisfactory participation in the creativity, action, service requirement. The highest total that a Diploma Programme student can be awarded is 45 points.
IB Recognition
IB Recognition communicates the value of an IB education. Recognition staff work to ensure that IB students are properly recognized by universities and governments for the unique credentials and qualifications of their IB education.
University recognition
The IB diploma is accepted in 75 countries at over 2000 universities, and the IB has a search directory on its website, although they advise students to check directly with each university for the recognition policy.[53] The IB also maintains a list of universities offering scholarships to IBDP graduates under conditions specified by each higher education institution, including 58 colleges and universities in the U.S. Please click on to the following link for further details:
Who can Apply?
Students who have completed / or are in the process of completing grade 10 in any stream such as IGCSE, CBSE, ICSE, IB MYP or any State board equivalent of grade 10 are eligible to apply.
The process of selection is as below:
- Upon the receipt of duly filled in online application forms, the parents are intimated via email of the entrance test dates. After verifying the relevant documents an entrance test is conducted in English, Mathematics and Science. The entrance test is conducted to assess the prior knowledge required for pursuing IBDP.
- No entrance test is conducted for IGCSE students of LMOIS, instead their performance in the school based assessment is considered for short listing.
- Based on the test results, and performance in school based examinations, the student and parents are called for an interaction with the Senior Principal/Principal ( IBDPC) for selection of subjects. Provisional admission is granted after a successful interview. Admission is confirmed upon the submission of final results of board exams.
More information on the IB diploma programme is available at their website: http://www.ibo.org/


text:
Macau,China --- "Featherweight Fury" --- Two-division world champion Vic "Raging Bull" Darchinyan gets ready to challenge undefeated (23-0) WBA world featherweight champion Nicholas Walters, Saturday, May 31 from the Cotai Arena at The Venetian Macao Resort in Macau,China. One other Featherweight title bout on the card to be broadcast on TopRank.TV along with the Darchinyan bout is : IBF featherweight champ Egveny Gradovich of Russia, vs. Alexander Miskirtchian of Belgium. Photos by Chris Farina/Top Rank.
Promoted by Top Rank®, in association with Tecate, PS4 and Foreman Boys Promotions, the Walters vs Darchinyan WBA world Featherweight title fight will be on the undercard of Donaire vs Vetyeka which will be televised in the US on HBO, same day at 4pm ET/PT.

subset: commoncrawl


text:
Hey hey hey! Thank you to everyone for entering the giveaway from Luna Protein. They are delicious and I hope you enjoy them!
The 5 winners are (chosen by Random.org):
- #53 – Laura Reich
- #46 – Pam Pike
- #57 – Cassie
- #4 – Katie @ Pop Culture Cuisine
- #3 – Heidi @ Show Some Decor
Congrats ladies!! I'll be emailing you all shortly to get all of your info. It's very important you email me back asap with the info so I can send it off in time. Thank you so much!
And I hope you all have a fabulous Labor Day weekend!


text:
Bragg: African American women embrace hair
Updated 10:04 am, Sunday, May 6, 2012
Since African American women drop a half-trillion dollars each year on their hair, you'd think they'd be happy with it.
But many aren't. If your hair is curly, kinky or coarse, but you want it smooth, straight, and bouncy, hair care becomes an full-time obsession. The concept of "good hair" — as explained in Chris Rock's 2009 documentary of the same name — becomes the Holy Grail for many women of color.
But some have had enough. And thus was born the natural hair movement, in which legions of African American woman opt out of the costly chemical treatments and their dependency on them.
Lifestyle Channel
- The Opioid Diaries: Trailer Time
- Texas Skye: Step inside the Buckhorn Saloon San Antonio Express-News
- 5 Signs You Could Have Strep Throat Health
- 23 Members Of Same Family Were Kicked Off A Carnival Cruise Fortune
- Warren Buffett to Retire from Kraft Heinz Board Wibbitz
- Anna Kaiser Physio Ball Workout Time
- 8 Signs Your Cough Could Actually Be Pneumonia Health
- Tone Your Arms wth a Bath Towel with Anna Kaiser Time
- Florida House Declares Porn Public Health Risk After Denying Assault Rifle Ban Buzz 60
- Workout Routines... with Wine Storyful
"I just decided to stop (straightening it) in 2001," says Briana Flowers, 28, co-founder of San Antonio Women With Natural Hair, a group that's tired of pouring lots of products in their hair. "I just didn't see it going on any longer."
Nicole Leonard, 32, stopped straightening her hair two years ago. She had been going to salons since she was 6 years old.
"I couldn't remember what my real hair looked like," she said. "My mom couldn't either."
Both women cut their hair short to get rid of the treated ends. Since then, they've let their hair grow back without chemical straightening. Their hair looks great and, as a bonus, they are no longer afraid of precipitation.
"I now have the amazing freedom of not having to run when it rains," says Leonard.
The natural hair group began when Flowers moved back to town after attending college out of state. She had stopped straightening years earlier and was always on the lookout for tips on hair care.
But since treated hair dominates the world of black women, many stylists aren't familiar with natural hair.
So Flowers went to the Web and found six local women with the same questions.
They connected over Meetup.com and met face to face to trade ideas. They began to meet regularly. They brought friends. The group grew. They would go out, as a group, to eat or socialize.
And whenever they met, Palmer and Leonard say, they would pick up stragglers.
"People see us and say 'I want to be with you,'" Leonard says, laughing.
"We were at the Cheesecake Factory one day and some woman saw us and her jaw dropped," Flowers says. "Her eyes got huge. She couldn't believe it."
On the day I sat down with Flowers and Leonard in late April, the group had 525 members, or naturalistas, as they sometimes refer to themselves. It adds two or three new members a week, Flowers says, so there could be more by now.
The natural hair movement doesn't equate to tonsorial neglect. The women still cut their hair, still groom it and still spend money on products. If you had to turn it into a slogan, you could say the goal is "pretty without chemicals."
And forget the Afro. Teasing and fluffing one of those, Leonard says, takes just as much time as maintaining a dyed-blonde, bone-straight look.
A bigger issue, however, is at play here. The straight hair look came about decades ago because black women wanted to get closer to a white ideal of beauty. The natural hair movement is emblematic of a worldview that's a little different.
There are still tangles, however. We are not in a post-racial hair world.
Leonard and Flowers say family members don't get it and white friends and colleagues aren't always ready for black women with natural hair. Many seemed more comfortable when their hair was straight. Nor were some shy about saying so.
"It wasn't a big deal," Leonard says. "Just a faux pas here and there."
Flowers recognizes that perception, too. "I've worn (straight hair) wigs to job interviews since I didn't know how they'd react."
email@example.com. Follow @roybragg on Twitter. Bragg's blog is at http://blog.mysanantonio. com/atlarge.


text:
Yep! We were right all along and yet we did our best to help Romney.
We prayed and we voted.
Connie could really belt out the ballads and also sing with passion!
Thanks for "Who's Sorry Now?" Really like that one!
Here's another girl who could really belt them out: https://www.youtube.com/watch?v=-FDqRo4K8M8
OK, Now it's time for me to get back on the Palin bandwagon. Please add me to the pinglist.
One of her best for sure. She never recovered from the rape.


text:
Soybean Futures End Higher
Published 7:00 pm, Tuesday, January 8, 2002
Soybeans rallied again Wednesday on the Chicago Board of Trade, continuing a strong rebound off last week's 30-year lows.
Wheat and corn prices retreated.
Dry weather in growing areas of Brazil and Argentina helped extend soybeans' rise to a third straight session. Expectations for more demand from China for U.S. exports underpinned the rally.
Corn investors turned bearish amid concerns about potential changes in the government's crop overview, due out Friday.
Wheat also slipped in positioning ahead of the U.S. Department of Agriculture reports.
Wheat for March delivery fell 21/4 cents to $3.023/4 a bushel; March corn fell 11/2 cent to $2.10 a bushel; March oats fell 8 cents to $1.953/4 a bushel; March soybeans rose 41/2 cents to $4.391/2 a bushel.
Beef futures advanced while pork futures declined on the Chicago Mercantile Exchange.
February live cattle rose .63 cent to 70.75 cents a pound; March feeder cattle rose .80 cent to 85.65 cents a pound; February lean hogs fell .20 cent to 54.47 cents a pound; February pork bellies fell the limit 3 cents to 74.80 cents a pound on a weak cash market and increased storage totals.


text:
tag:blogger.com,1999:blog-30675938607150122582018-01-12T19:52:47.554-08:00Future FoundriesTwisted, Python and other technical firstname.lastname@example.com:blogger.com,1999:blog-3067593860715012258.post-35164137354627638722014-04-14T07:52:00.002-07:002014-04-14T07:52:43.254-07:00Crochet 1.2.0, now with a better API!Crochet is a library for using Twisted more easily from blocking programs and libraries. The latest version, released here at PyCon 2014, includes a much improved API for calling into Twisted from threads. In particular, a timeout is passed in - if it is hit the underlying operation is cancelled, and an exception is raised. Not all APIs in Twisted support cancellation, but for those that do (or APIs you implement) this is a really nice feature. You get high level timeouts (instead of blocking sockets' timeout-per-socket-operation) and automatic cleanup of resources if something takes too long.

#!/usr/bin/python
"""
Do a DNS lookup using Twisted's APIs.
"""
from __future__ import print_function

# The Twisted code we'll be using:
from twisted.names import client

from crochet import setup, wait_for
setup()

# Crochet layer, wrapping Twisted's DNS library in a blocking call.
@wait_for(timeout=5.0)
def gethostbyname(name):
 """Lookup the IP of a given hostname.

 Unlike socket.gethostbyname() which can take an arbitrary amount
 of time to finish, this function will raise crochet.TimeoutError
 if more than 5 seconds elapse without an answer being received.
 """
 d = client.lookupAddress(name)
 d.addCallback(lambda result: result[0][0].payload.dottedQuad())
 return d

if __name__ == '__main__':
 # Application code using the public API - notice it works in a normal
 # blocking manner, with no event loop visible:
 import sys
 name = sys.argv[1]
 ip = gethostbyname(name)
 print(name, "->", ip)

 Itamar firstname.lastname@example.com:blogger.com,1999:blog-3067593860715012258.post-54361482199648570442014-03-15T05:45:00.002-07:002014-03-15T05:45:35.329-07:00Signal/GC-safe cross-thread queueing in PythonI've just released a new version of Crochet, and one of the bugs fixed involves an interesting problem - reentrancy. In this particular case I'm talking about garbage collection and signal reentrancy - any function your Python program is running may be interrupted at any time (on bytecode boundaries) to do garbage collection or handle a signal. A signal handler can run arbitrary Python code, as can GC via to __del__ or weakref callbacks. Once that code finishes running control is returned to the original location in the code.

Unfortunately, due to a bug in Python, Queue.put() can deadlock in the following situation:

As part of calling Queue.put(), a thread acquires the Queue's lock. This lock does not support being acquired more than once by the same thread.

GC or a signal handler interrupts the function call.

If the GC or signal handler code then also does Queue.put(), it will try to acquire the lock again... and since it's already locked it blocks waiting for the lock to be released.

Since the signal handler/GC code is now blocked, control is never returned to original code, so lock is never released there.

The thread is now deadlocked and will never recover.

Unfortunately there was no way to prevent the Queue.put() in GC; the Queue accepts log messages, and this is a GC-caused logging message coming out of code that is not under Crochet control's.

The obvious short-term solution is to reimplement a simplified Queue using Python's RLock, which allows the same thread to acquire the lock multiples times. But... RLock isn't reentrancy safe either due to another bug in Python! I could wrap OS-specific reentrant lock implementations, but that's a bigger project than I want to start.

The solution I ended up with (suggested by Jean-Paul Calderone I believe) was giving up on using threading primitives to communicate across threads. Instead I used the self-pipe trick. That is, the thread uses select() (or poll() or epoll()) to wait on one end of the pipe; to wake the thread up and tell it to check for new messages to process we simply write a byte to the other end of the pipe. Since Crochet uses Twisted, I had a pre-written event loop that already implemented self-pipe waking, and now the logging thread runs another Twisted reactor in addition to the regular reactor thread.

As far as I can tell this works, but it feels a bit like overkill. I'd welcome suggestions for other solutions.

Itamar email@example.com:blogger.com,1999:blog-3067593860715012258.post-32638328858496962422014-03-09T11:26:00.001-07:002014-03-09T11:27:46.933-07:00Twisted on Python 3 now pip installableThe subset of Twisted that has been ported to Python 3 can now be pip installed. By either pointing at a version control URL or requiring Twisted 14.0 (once it's released), you can now have Twisted as a dependency for your Python 3 packages.

Here's a slightly edited version of my Travis-CI config for Crochet, demonstrating how I run unit tests on both Python 2 and Python 3 versions of Twisted (slightly tricky because the trial test runner hasn't been ported yet):

language: python

env:
 - TWISTED=Twisted==13.0 RUNTESTS=trial
 - TWISTED=Twisted==13.1 RUNTESTS=trial
 - TWISTED=Twisted==13.2 RUNTESTS=trial

python:
 - 2.6
 - 2.7
 - pypy

matrix:
 include:
 - python: 3.3
 env: TWISTED=git+https://github.com/twisted/twisted.git RUNTESTS="python -m unittest discover"

install:
 - pip install -q --no-use-wheel $TWISTED --use-mirrors
 - python setup.py -q install

script: $RUNTESTS crochet.tests

Itamar email@example.com:blogger.com,1999:blog-3067593860715012258.post-53729911100428898502013-10-19T08:56:00.003-07:002013-10-19T08:57:23.274-07:00Announcing Crochet v1.0: Use Twisted Anywhere!It's been a busy 6 months since I first released Crochet, and now it's up to v1.0. Along the way I've expanded the documentation quite a bit and moved it to Sphinx, fixed a whole bunch of bug reports from users, added some new APIs and probably introduced some new bugs. What is Crochet, you ask?

Crochet is an MIT-licensed library that makes it easier for blocking or threaded applications like Flask or Django to use the Twisted networking framework. Crochet provides the following features:

Runs Twisted's reactor in a thread it manages.

The reactor shuts down automatically when the process' main thread finishes.

Hooks up Twisted's log system to the Python standard library <tt class="docutils literal">logging</tt>framework. Unlike Twisted's built-in <tt class="docutils literal">logging</tt> bridge, this includes support for blocking Handler instances.

A blocking API to eventual results (i.e. <tt class="docutils literal">Deferred</tt> instances). This last feature can be used separately, so Crochet is also useful for normal Twisted applications that use threads.

You can download Crochet at: http://pypi.python.org/pypi/crochet

Documentation can be found on Read The Docs.

Bugs and feature requests should be filed at the project Github page.

Itamar firstname.lastname@example.com:blogger.com,1999:blog-3067593860715012258.post-57266184377923188212013-06-10T09:14:00.003-07:002013-06-10T09:14:43.310-07:00Available for Python ConsultingNeed someone to write high-quality, well-tested and robust Python code? If you need some Python or Twisted development done (or some other language, for that matter), I now have some free time in my schedule. You can reach me at email@example.com.Itamar firstname.lastname@example.com:blogger.com,1999:blog-3067593860715012258.post-20114566421076240002013-05-24T06:59:00.001-07:002013-05-24T06:59:14.995-07:00Announcing Crochet 0.7: Easily use Twisted from threaded applications
Crochet is an MIT-licensed library that makes it easier for threaded applications like Flask or Django to use the Twisted networking framework. Features include:

Runs Twisted's reactor in a thread it manages.

Hooks up Twisted's log system to the Python standard library <tt>logging</tt>framework. Unlike Twisted's built-in <tt>logging</tt> bridge, this includes support for blocking logging.Handler instances.

Provides a blocking API to eventual results (i.e. <tt>Deferred</tt> instances).

This release includes better documentation and API improvements, as well as better error reporting.
You can see some examples, read the documentation, and download the package at:

https://pypi.python.org/pypi/<wbr></wbr>crochet

For those of you who have seen Crochet before, I'd like to feature a new example. In the following code you can see how Twisted and Crochet allow you download information in the background every few seconds and then cache it, so that the request handler for your web application is not slowed down retrieving the information:

"""
An example of scheduling time-based events in the background.

Download the latest EUR/USD exchange rate from Yahoo every 30
seconds in the background; the rendered Flask web page can use
the latest value without having to do the request itself.

Note this is example is for demonstration purposes only, and
is not actually used in the real world. You should not do this
in a real application without reading Yahoo's terms-of-service
and following them.
"""

from flask import Flask

from twisted.internet.task import LoopingCall
from twisted.web.client import getPage
from twisted.python import log

from crochet import run_in_reactor, setup
setup()

class ExchangeRate(object):
 """
 Download an exchange rate from Yahoo Finance using Twisted.
 """

 def __init__(self, name):
 self._value = None
 self._name = name

 # External API:
 def latest_value(self):
 """
 Return the latest exchange rate value.

 May be None if no value is available.
 """
 return self._value

 @run_in_reactor
 def start(self):
 """
 Start the background process.
 """
 self._lc = LoopingCall(self._download)
 # Run immediately, and then every 30 seconds:
 self._lc.start(30, now=True)

 def _download(self):
 """
 Do an actual download, runs in Twisted thread.
 """
 print "Downloading!"
 def parse(result):
 print("Got %r back from Yahoo." % (result,))
 values = result.strip().split(",")
 self._value = float(values[1])
 d = getPage(
 "http://download.finance.yahoo.com/d/quotes.csv?e=.csv&f=c4l1&s=%s=X"
 % (self._name,))
 d.addCallback(parse)
 d.addErrback(log.err)
 return d

# Start background download:
EURUSD = ExchangeRate("EURUSD")
EURUSD.start()

# Flask application:
app = Flask(__name__)

@app.route('/')
def index():
 rate = EURUSD.latest_value()
 if rate is None:
 rate = "unavailable, please refresh the page"
 return "Current EUR/USD exchange rate is %s." % (rate,)

if __name__ == '__main__':
 import sys, logging
 logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)
 app.run()

Itamar firstname.lastname@example.com:blogger.com,1999:blog-3067593860715012258.post-54759824106093221842013-04-25T12:05:00.001-07:002013-04-25T12:05:28.157-07:00Unittesting With Localized PatchingIn my previous two posts, I gave examples of alternatives to patching in unittests: class-based and function-based parameterization. Nick Coghlan pointed out that my example of patching was a little bit of a strawman argument - the most global (and therefore the most side-effecty) way of doing patching. Here's what he wrote:

While your point about the risks of patching destructive calls is valid, if you're going to decry the practice of using mocks in tests, at least decry a version which uses them properly. In your first example you are patching the wrong module - you shouldn't patch os._exit (with potentially non-local effects), you should patch the module under test so that *in that module only*, the reference "os._exit" resolves to your patched function.

Most functions under test *aren't* destructive (so you'll get the expected test result failure), and by jumping straight to dependency injection in cases where you don't need it, you can end up adding a huge amount of complexity to your production code without adequate reason *and* give yourself additional code paths to test in the process. Dependency injection should be used only if there is a *production* related reason for adding it (and "this function is destructive, so we should use dependency injection rather than mocking to test it" is a valid reason).

For those non-destructive cases, you can avoid most of the non-local effects without adding complexity to the production code by localising your mock operation to as narrow a target as possible.
The version of patching he suggests is definitely a lot better than my initial example, so let's take a look. First, the module we're going to test:

import os

def exit_with_result(function):
 result = function()
 if result:
 os._exit(0)
 else:
 os._exit(1)

And now the patch-based tests, based on example code from Nick Coghlan (any mistakes were added by me):

import unittest
# Note that we don't import os, because we're not touching it!

import exitersketch

class FakeOS:
 EXIT_NOT_CALLED = object()
 CALLED_WITH_DEFAULT = object()

 def __init__(self, module):
 self.module = module
 self.exit_code = self.EXIT_NOT_CALLED

 def _exit(self, code=CALLED_WITH_DEFAULT):
 self.exit_code = code

 def __getattr__(self, attr):
 return getattr(self.original_os, attr)

 def __enter__(self):
 self.original_os = self.module.os
 self.module.os = self
 return self

 def __exit__(self, *args):
 self.module.os = self.original_os

class ExiterTests(unittest.TestCase):

 def test_exiter_success(self):
 with FakeOS(exitersketch) as fake:
 exitersketch.exit_with_result(lambda: True)
 self.assertEqual(fake.exit_code, 0)

 def test_exiter_failure(self):
 with FakeOS(exitersketch) as fake:
 exitersketch.exit_with_result(lambda: False)
 self.assertEqual(fake.exit_code, 1)

if __name__ == '__main__':
 unittest.main()

This version is definitely a superior form of patching: only one module's view is impacted. Notice also the use of __getattr__ to ensure overriding exitersketch.os only overrides os._exit and not other parts of the os module. Nonetheless, it still suffers from the inherent problem of patching: it's overriding more state than necessary. Thus it's still possible to call destructive functions by mistake if you rearrange your imports. For non-destructive functions it's still possible to have a test unexpectedly call a patched function, albeit only from code in the same module rather than globally. If you are going to use patching, though, making the patching as local as possible is definitely the way to go.Itamar email@example.com:blogger.com,1999:blog-3067593860715012258.post-16078925918352904292013-04-22T16:39:00.001-07:002013-04-25T11:40:41.277-07:00Unittesting Without Patching: A FollowupI got a couple questions about my previous post asking why I didn't show the simpler, function-based style of parameterization. This style does make unittesting possible, and with less complexity than creating a new class:

import os

def exit_with_result(function, _exit=os._exit):
 result = function()
 if result:
 _exit(0)
 else:
 _exit(1)

The problem is that when you add arguments to a function, the parameterization leaks into your public API. This means that:

You need to document the fact that these extra arguments (e.g. _exit in the example above) should not be used.

*args and **kwargs can't be used at all.

Changing the function signature later on can be more difficult.

If you have large numbers of things you need to parameterize, the function definition gets pretty long and ugly.

In the class style in contrast the public API is not affected by the need to unittest.

What's more, you will often have a group of related functions using the same modules, functions or classes. By grouping them in a class, you can implement the parameterization hook once, rather than for every function. You can see an example of this in Crochet (specifically the Eventloop class), where the parameterized reactor is used by multiple functions. If the code you need to parameterize is already a method, setting the parameters in __init__ or as a class attribute is even more attractive, requiring only minimal additional complexity.

Update: If you go with this style of parameterization, you still need to assert that in the default case it actual calls the correct function (e.g. os._exit for exit_with_result). Probably the nicest way to do so is to use inspect.getcallargs.Itamar firstname.lastname@example.com:blogger.com,1999:blog-3067593860715012258.post-29474025246751489752013-04-18T10:03:00.000-07:002013-04-18T10:14:20.595-07:00Unittesting Without Patching
Python has the power to override any attribute on any module or class, but just because you can doesn't mean you should. This is true in regular code, but just as true of unittests. Many testing libraries (mock, Twisted's trial, py.test) provide facilities for overriding some piece of global state; you can also do so manually. Occasionally these facilities prove invaluable, but often they are used unnecessarily. Better alternatives are available.

Before I explain why patching is problematic, let's look at an example. Consider the following module:

import os

def exit_with_result(function):
 result = function()
 if result:
 os._exit(0)
 else:
 os._exit(1)

On the face of it patching is necessary to test this example. The tests would look something like this:

import unittest
import os

from exitersketch import exit_with_result

class ExiterTests(unittest.TestCase):
 def setUp(self):
 self.exited = None
 self.originalExit = os._exit
 os._exit = self.fakeExit

 def fakeExit(self, code=0):
 self.exited = code

 def tearDown(self):
 os._exit = self.originalExit

 def test_exiter_success(self):
 exit_with_result(lambda: True)
 self.assertEqual(self.exited, 0)

 def test_exiter_failure(self):
 exit_with_result(lambda: False)
 self.assertEqual(self.exited, 1)

if __name__ == '__main__':
 unittest.main()

Having seen patching, and seen that it works as a testing technique, why should we avoid it?

Patching is fragile. If the example above changed import os to from os import _exit, the patching would need to be modified. However, if you forgot to modify the patching, unexpected code will run. In this case, your test run will mysterious exit half way through. If the function you are attempting to patch is more destructive, worse things may happen: credit cards may get charged, data may get deleted, etc..

Patching leads to unexpected behaviour. Because patching is a global change, the patched code may be called not just by the function being tested, but by code it is calling which happens to use the same patched code.

Patching indicates bad design. Code code should be designed to be easily testable. Having to modify global state suggests that the code is not as modular as one might hope.

How to avoid patching? Parameterization, aka dependency injection. We refactor the code to accept the _exit function as a parameter. Notice the the public API has not changed:

import os

class _API(object):
 def __init__(self, exit):
 self.exit = exit

 def exit_with_result(self, function):
 result = function()
 if result:
 self.exit()
 else:
 self.exit(1)

_api = _API(os._exit)
exit_with_result = _api.exit_with_result

Our tests can now test both that _API.exit_with_result class has the correct behavior in general, and that the public exit_with_result is going to call os._exit in particular.

import unittest
import os

from exiter import _api, _API, exit_with_result

class ExiterTests(unittest.TestCase):
 def setUp(self):
 self.exited = None

 def fakeExit(self, code=0):
 self.exited = code

 def test_api(self):
 self.assertIsInstance(_api, _API)
 self.assertEqual(_api.exit, os._exit)
 self.assertEqual(exit_with_result, _api.exit_with_result)

 def test_exiter_success(self):
 _API(self.fakeExit).exit_with_result(lambda: True)
 self.assertEqual(self.exited, 0)

 def test_exiter_failure(self):
 _API(self.fakeExit).exit_with_result(lambda: False)
 self.assertEqual(self.exited, 1)

if __name__ == '__main__':
 unittest.main()

The same technique is useful when you are tempted to store some state in a module. Instead, store an instance of a class:

class _Counter(object):
 value = 0

 def increment(self):
 self.value += 1

 def value(self):
 return self.value

_counter = _Counter()
increment = _counter.increment
value = _counter.value

As I've demonstrated, patching can often be avoided by restructuring code to be more testable. The same Python features that make patching so easy also make avoiding patching just as easy. Given the choice, you should avoid changing global state when testing individual components.
Itamar email@example.com:blogger.com,1999:blog-3067593860715012258.post-56751535965716008292013-04-12T09:11:00.000-07:002013-04-12T09:11:04.398-07:00SSH Into Your Python ServerHave you ever wanted to see what's going on inside your Python server? With Crochet and Twisted, you can add a Python prompt to you process that is accessible via SSH, allowing you to poke around in the internals of your running program. Here's an example session to a Flask server:

$ ssh admin@localhost -p 5022
admin@localhost's password: ******
>>> app
<flask.app.Flask object at 0x28a96d0>
>>> app.url_map
Map([<Rule '/' (HEAD, OPTIONS, GET) -> index>,
 <Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>])
>>> from twisted.internet import reactor
>>> reactor._selectables
{9: <SSHServerTransport #0 on 5022>, 3: <<class 'twisted.internet.tcp.Port'> of twisted.conch.manhole_ssh.ConchFactory on 5022>, 6: <twisted.internet.posixbase._UnixWaker object at 0x28a2510>}

The code to start the SSH server has quite a lot of boilerplate, so I filed a ticket to provide a utility function. If you're using the system Twisted, you may need to install Twisted's Conch package, e.g. apt-get install python-twisted-conch on Ubuntu.

import logging

from flask import Flask
from crochet import setup, in_reactor
setup()

# Web server:
app = Flask(__name__)

@app.route('/')
def index():
 return "Welcome to my boring web server!"

@in_reactor
def start_ssh_server(reactor, port, username, password,
 namespace):
 """
 Start an SSH server on the given port, exposing a Python
 prompt with the given namespace.
 """
 from twisted.conch.insults import insults
 from twisted.conch import manhole, manhole_ssh
 from twisted.cred.checkers import (
 InMemoryUsernamePasswordDatabaseDontUse as MemoryDB)
 from twisted.cred.portal import Portal

 sshRealm = manhole_ssh.TerminalRealm()
 def chainedProtocolFactory():
 return insults.ServerProtocol(manhole.Manhole,
 namespace)
 sshRealm.chainedProtocolFactory = chainedProtocolFactory

 portal = Portal(
 sshRealm, [MemoryDB(**{username: password})])
 reactor.listenTCP(port, manhole_ssh.ConchFactory(portal),
 interface="127.0.0.1")

if __name__ == '__main__':
 import sys
 logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)
 start_ssh_server(
 5022, "admin", "secret", {"app": app}).wait()
 app.run()

Itamar email@example.com:blogger.com,1999:blog-3067593860715012258.post-40266040494183200012013-04-10T05:48:00.003-07:002013-04-10T10:08:05.185-07:00Crochet: Background Operations for Threaded ApplicationsIn my previous post I showed Crochet doing a blocking call against a Twisted API. In this example, you can see how Twisted and Crochet allow you to run an operation in the background. An HTTP request for a new user starts a download in the background, and a reference is stored in the user's session. Every time the user reloads the page, a check is made to see if the download is finished, and if it is done it is display. You can also see the stash()/retrieve_result() API in use, which allows temporarily storing results under a key suitable for serialization in a session object.

import logging
from flask import Flask, session, escape
from crochet import setup, in_reactor, retrieve_result, TimeoutError
setup()

app = Flask(__name__)

@in_reactor
def download_page(reactor, url):
 """
 Download a page.
 """
 from twisted.web.client import getPage
 return getPage(url)

@app.route('/')
def index():
 if 'download' not in session:
 # @in_reactor functions return a DeferredResult:
 result = download_page('http://google.com')
 session['download'] = result.stash()
 return "Starting download, refresh to track progress."

 # retrieval is a one-time operation:
 result = retrieve_result(session.pop('download'))
 try:
 download = result.wait(timeout=0.1)
 return "Downloaded: " + escape(download)
 except TimeoutError:
 session['download'] = result.stash()
 return "Download in progress..."

if __name__ == '__main__':
 import os, sys
 logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)
 app.secret_key = os.urandom(24)
 app.run()

Itamar firstname.lastname@example.com:blogger.com,1999:blog-3067593860715012258.post-43103961794587022242013-04-09T10:44:00.000-07:002013-04-09T11:40:52.708-07:00Presenting Crochet: Use Twisted as a libraryTwisted is an event-driven framework; by default it expects to run the reactor event loop in your main thread to drive your application. If however you're writing a Django or Flask application you may want to use Twisted as just another library. Unless you choose to use Twisted as a WSGI container, this requires you to run the reactor in a thread. Today I am happy to announce Crochet, which makes using Twisted even easier in this situation.

Here's an example program using Crochet, allowing it to easily use Twisted from a normal, blocking command-line tool:

from __future__ import print_function

from crochet import setup, in_reactor
setup()

@in_reactor
def mx(reactor, domain):
 """
 Return list of MX domains for a given domain.
 """
 from twisted.names.client import lookupMailExchange
 def got_records(result):
 hosts, authorities, additional = result
 return [str(record.name) for record in additional]
 d = lookupMailExchange(domain)
 d.addCallback(got_records)
 return d

def main(domain):
 print("Mail servers for %s:" % (domain,))
 for mailserver in mx(domain).wait():
 print(mailserver)

if __name__ == '__main__':
 import sys
 main(sys.argv[1])

When we run it on the command line, output looks this:

$ python mxquery.py gmail.com
Mail servers for gmail.com:
alt2.gmail-smtp-in.l.google.com
alt2.gmail-smtp-in.l.google.com
alt3.gmail-smtp-in.l.google.com
alt3.gmail-smtp-in.l.google.com
alt4.gmail-smtp-in.l.google.com
alt4.gmail-smtp-in.l.google.com
alt1.gmail-smtp-in.l.google.com
gmail-smtp-in.l.google.com
gmail-smtp-in.l.google.com

The library provides much more functionality, but that's the gist of it: it runs and stops the Twisted reactor for you, and wraps asynchronous results in a blocking API. If you'd like to try out Crochet, or learn more about its other features, visit Crochet's PyPI page.Itamar firstname.lastname@example.com:blogger.com,1999:blog-3067593860715012258.post-30749444500677843202013-02-12T11:13:00.000-08:002013-02-12T11:17:04.284-08:002-day Twisted class in San Francisco: Early Bird ends FridayIf you want to build reliable, well-tested network applications in Python, Twisted may be the tool you need. In this two-day class, taking place in March 11th and 12th (right before PyCon) we will cover the basic principles and core APIs of Twisted. Early bird pricing will save you $100, and ends in just three more days.

Covered material will include:

Understanding Event Loops: we'll re-implement Twisted's core APIs step-by-step (reactor, transport, protocol), explaining the why and how of event-driven networking.

TCP Clients and Servers.

Scheduling Timed Events.

Deferreds: the motivation and uses of Twisted's result callback abstraction.

Producers and Consumers: dealing with large amounts of data.

Unit Testing: how to why test your networking code.

A large, self-paced exercise, implementing a HTTP server and client from scratch using pre-written unit tests as guidance, and our help as needed. (These last two points will also be presented at PyCon, at the Twisted testing tutorial.)

To learn more and sign up for the class visit our Eventbrite page.

Abous us:

Jean-Paul Calderone has consulted for Fortune 500 companies, startups and research institutions. He has taught Twisted tutorials at PyCon, Fluendo SA in Barcelona, and Rackspace Inc. Jean-Paul has been one of the core Twisted maintainers since 2002, and is the maintainer of pyOpenSSL.

Itamar Turner-Trauring spent many years working on distributed applications as part of ITA Software and then Google's airline reservation system, coding in Python (often using Twisted), C++ and a little bit of Common Lisp. Itamar has also worked on projects ranging from a reliable multicast messaging system with congestion control, a prototype-based configuration language, to a multimedia kiosk for a museum. Itamar has been one of the core Twisted maintainers since 2001.

Itamar email@example.com:blogger.com,1999:blog-3067593860715012258.post-21194417938895946852013-02-06T18:32:00.002-08:002013-02-06T18:32:29.273-08:00Mock AssurancesI recently tried the mock library; it's quite useful, and in general using it was a pleasant experience... until things turned scary. While refactoring some code and corresponding tests I hit a point where a test should have been failing, and yet was nonetheless passing. A little investigation led me to the problem, and that's when I got really nervous.

Here's a rather silly example of two unit tests using mock.

import unittest
import mock

class C:
 def function(self, x):
 pass

class Tests(unittest.TestCase):
 def test_positive(self):
 C2 = mock.Mock(spec=C)
 obj = C2()
 obj.function(1)
 obj.function.assert_called_once_with(1)

 def test_negative(self):
 C2 = mock.Mock(spec=C)
 obj = C2()
 obj.function(1)
 obj.function.assert_not_called()

if __name__ == '__main__':
 unittest.main()

 One would expect test_negative to fail, but in fact both tests pass:

$ python mocktests.py
..
------------------------------------
Ran 2 tests in 0.001s

OK

Oops.

If you've used mock before, you probably know what's going on. The mock library creates new attributes on demand if they don't exist. Thus:

>>> import mock
>>> obj = mock.Mock()
>>> obj.assert_called_once_with
<bound method Mock.assert_called_once_with of <mock.Mock object at 0x7f6e1c18a990>>
>>> obj.assert_not_called
<Mock name='mock.assert_not_called' id='140110894509008'>

Once again, oops. I had invented a new assertion method assert_not_called which doesn't actually exist, and mock had happily created a new object for me. My test was completely broken. My mistake, and therefore my fault. And in fact the mock documentation does mention the possibility of this happening, deep within the bowels of the API documentation: "Because mocks auto-create attributes on demand, and allow you to call them with arbitrary arguments, if you misspell one of these assert methods then your assertion is gone." An appropriate fix is provided, the mock.create_autospec API. It would have been better to include this suggestion in the intro documentation; better yet would be preventing the problem in the first place.

By their very nature, test assertions do nothing silently in the expected case. It's thus quite dangerous to have a library specifically intended for testing where typos create calls that are supposed to be assertions but actually assert nothing, silently. In general, I prefer tools that don't assume I'm perfect. If I never made mistakes I wouldn't need to write tests in the first place, at least for code where I was the only maintainer.

What's more, this will also be a problem if new assertion methods are ever added to future versions of mock. Imagine developer A writes tests using a new assertion only available in mock v1.1; when she runs the tests, they work correctly. Developer B is working on the same code base, but forgot to upgrade and is using mock v1.0 that lacks the new assertion. When he runs the tests they are not actually testing what they seem to be testing. Oops.

The basic design flaw here is having a public API on objects that also create arbitrary attributes on demand. The whole public API of mock.Mock (assertions, attributes, etc.) should be exposed as module-level functions, so that typos or misremembering the API will result in a nice informative AttributeError. Until that happens, I will stick to mock.create_autospec, and avoid mock.Mock or mock.MagicMock.Itamar email@example.com:blogger.com,1999:blog-3067593860715012258.post-33407289680461247692013-01-29T04:38:00.000-08:002013-01-29T04:38:09.805-08:00Test-Driven Development with Twisted: A PyCon 2013 TutorialTesting network applications is hard: the order of events is unpredictable, the passage of time is important, and the sources of errors are many. At PyCon this year I will be teaching a three-hour tutorial on test-driven development with Twisted, demonstrating how to build well-tested network applications.

(As a reminder, I'm also teaching a two day Twisted class in San Francisco with Jean-Paul Calderone, on the Monday and Tuesday before PyCon; early bird pricing expires Feb 15th. The material in the testing tutorial is also included in the longer class.)

In the lecture part of the tutorial I will cover:

Testing network protocols in a deterministic manner (no need for actual TCP connections).

Testing the passage of time (no need to wait 2 hours in your test to prove that a timeout is hit).

Twisted's testing infrastructure for running the reactor and handling Deferreds.

Once that is done, students will begin a hands-on lab, implementing a HTTP server from scratch. I will provide pre-written unit tests, and students will write code to make these tests pass, with help from me (and perhaps an assistant or two depending on number of students).

The lessons here are implicit in the design of the tests, and the design of the server as shaped by the tests. If anything these lessons are more important than understanding Twisted's testing APIs:

The scoping of tests into small units of work.

Separation of concerns - parsing/generating bytes vs. business logic.

Design patterns for Deferred APIs.

Building robust network applications, including dealing with bad input and timeouts.

Separation of library code and application configuration.

Students who finish early can move on to a more difficult exercise, implementing both the tests and logic for an HTTP client, but benefiting from the ability to ask for in-person help.

You can sign up at the PyCon website as part of registration, or read more on the tutorial's PyCon web page.
Itamar firstname.lastname@example.com:blogger.com,1999:blog-3067593860715012258.post-42194934441002669192013-01-28T08:22:00.002-08:002013-01-29T04:26:21.103-08:00Deferred Cancellation, part 3: TimeoutsLet's send an email! Here's the steps involved in what from the outside looks like a simple function call (and this is of course a very high-level view):

Look up the IP of our SMTP server's domain using DNS. This may involve a series of UDP messages to one or more servers, which may do further work on our behalf.

Establish a TCP connection with the server.

Exchange a series of commands with the server over the TCP connection, some of which may involve arbitrarily complex processing on the server-side.

Obviously a lot can go wrong here, from communication problems to hardware failures to software bugs. The fact it usually works is an impressive engineering feat. For our purposes the interesting point is that failure can take an arbitrary amount of time.

The necessary and obvious solution is a timeout: if enough time has passed without getting a response, abort the operation and consider it to have failed. We may end up sending duplicate emails if we retry, but that is a business logic decision tied to the specifics of an application, so not something I'll be talking about. Now, we could have timeouts on each step of the process (DNS lookup, TCP connection, each command), and in fact may want timeouts for each of these. But from the point of view of the email sending API, the time it takes to do the underlying steps is irrelevant, except perhaps for debugging or performance: if we want to send an email within 5 seconds, we want it to take 5 seconds, and don't care which step happens to be the slow one.

This is where Deferred cancellation comes in. We want to make sure each step along the way has a cancellation function registered, if possible, but that's not strictly necessary. Our code looks something like this:

def sendmail(from, to, data, smtphost, smtpport=25):
 endpoint = TCPv4ClientEndpoint(smtphost, smtpport)
 d = endpoint.connect(SMTPFactory())
 def gotProtocol(smtpProtocol)
 return smtpProtocol.send(from, to, data)
 d.addCallback(gotProtocol)
 return d

The wonderful thing about Deferreds is that, as with results, cancellation also gets automatically chained. Thus if we call cancel() on the result of sendmail(), it will cancel the Deferred connecting to the server if that's where we are in the process, or the Deferred return from SMTPProtocol.send() if that's what we're waiting for. So if want to time out sending an email after 5 seconds... all we have to do is cancel the Deferred returned by the sendmail() function after 5 seconds if we haven't gotten a result! The following utility function, soon to be part of Twisted (ticket #5786), does just that:

def timeoutDeferred(deferred, timeout):
 delayedCall = reactor.callLater(timeout, deferred.cancel)
 def gotResult(result):
 if delayedCall.active():
 delayedCall.cancel()
 return result
 deferred.addBoth(gotResult)

And now, we can send an email with a timeout of our choice, e.g. 5 seconds:

sent = sendmail("email@example.com", "email@example.com",
 "An email message.", "smtp.example.net")
timeoutDeferred(sent, 5)

The nice thing about this API is that it doesn't require adding extra timeout arguments to every function. Instead, the highest-level caller just adds a timeout. And underlying callers (e.g. the TCP connect, its underlying DNS lookup, etc.) can have their own, more limited timeouts as well.

To summarize: supporting Deferred cancellation is a great way to make the integration points of your library code more useful, by allowing users of your code both ad-hoc and timeout-driven cancellation of your operations. And as the user of a Twisted library, timeouts can be easily added to any Deferred-returning API, in particular those that explicitly support cancellation for you.Itamar email@example.com:blogger.com,1999:blog-3067593860715012258.post-44787308801093106422013-01-13T17:13:00.000-08:002013-01-13T17:13:12.200-08:00Update: Early bird discount for our Twisted class
If you pay for our class before February 15th, you'll get $100 off; sign up for our two-day Twisted class in San Francisco now at http://futurefoundries.eventbrite.com.
Itamar firstname.lastname@example.com:blogger.com,1999:blog-3067593860715012258.post-73393573851653202202013-01-08T09:17:00.000-08:002013-01-29T04:33:07.039-08:002-day Twisted Class in San FranciscoInterested in learning the fundamentals of Twisted and event-driven networking with Python? If you live in the Bay Area or SF, or are visiting for PyCon, you can join Jean-Paul Calderone and I for a two day intro to Twisted in San Francisco.
Location: San Francisco, exact site TBA.
Dates: March 11-12, the Monday and Tuesday before PyCon.
Cost: $650 early bird, or $750 after Feb 15.

Sign up now!

Covered Material
Combining a lecture with plenty of hands-on exercises, covered topics will include:

Understanding Event Loops: we'll re-implement Twisted's core APIs step-by-step (reactor, transport, protocol), explaining the why and how of event-driven networking.

TCP Clients and Servers.

Scheduling Timed Events.

Deferreds: the motivation and uses of Twisted's result callback abstraction.

Producers and Consumers: dealing with large amounts of data.

Unit Testing: how to test your networking code.

A large, self-paced exercise, implementing a HTTP server and client from scratch using pre-written unit tests as guidance, and our help as needed.

Daily Schedule (Tentative)
9:30-12:30: Lecture and exercises.
12:30-13:30: Lunch break.
13:30-16:30: Lecture and exercises.
16:30-17:30: Extended exercise time, and in-depth Q&A.Itamar email@example.com:blogger.com,1999:blog-3067593860715012258.post-52458264576495740532012-11-30T11:30:00.000-08:002012-11-30T11:49:14.056-08:00Teaching with Unit Tests
Unit tests, it seems, are good for more than just building robust software. I recently taught a Twisted class at Cisco, which included both a lecture and hands-on exercises. Some of the exercises were simple coding exercises: a specification the students needed to implement. One of the larger exercises, however, came with pre-written unit tests. The students needed to make all the tests pass, one by one, and the solution was finished when all the tests are done. Based on both my own observations and some feedback from the students, providing unit tests greatly improves the educational value of an exercise.

Creating The Exercise

Before explaining the benefits, I think it's worth explaining how I created the tests and what I provided the students. The exercise involved implementing a toy HTTP server, sufficient to answer simple browser requests. In order to create the tests I implemented a sample solution using test-driven development: first writing a test, then making it pass. I implemented the tests and corresponding code starting from basic features, and working up to more sophisticated features. Because I was using test-driven development, I was fairly confident (and the results from the students confirmed this) that the unit tests provided sufficient coverage to recreate my implementation. The students received only the tests, and just enough of the solution module to make it importable (some class definitions with no actual code).

In addition to unit tests, which the students were asked to solve in the given order, I also provided functional tests at appropriate points in the sequence of unit tests. For example, after implementing the minimal functionality necessary to parse and respond to a HTTP request, I provided a functional test where a real HTTP client talked to the server implementation. This often caught problems in the students implementation where their implementation was too fragile. I could have provided even more extensive unit tests, but functional tests did turn out to be a good way to catch coding issues I was unable to predict.

Once a functional test passed, the students could then run a demo server which they could point a browser at. After implementing half the tests, they were able to run a simple demo HTTP application, and when they finished all the tests, another more complex and interesting demonstration.

The Benefits to Students

Obvious Criteria for Success: Passing unit tests are a clear indication that the exercise had been solved correctly.

Guidance: Rather than having to design and structure an application with a new, unfamiliar API, the design is implicitly included. Plus, it's always clear what the next step is: make the next test pass.

Debuggability: Without unit tests, it's not clear how to approach a broken solution (assuming one can even recognize the brokenness). A failing unit test, on the other hand, exposes the interaction pattern with the code, and how it ought to work. A failing assertion points at what needs fixing.

A sense of achievement: Knowing you've gone from 2 passing tests to 3 passing tests gives a sense of accomplishment, and the knowledge that you are making progress. Without unit tests, it's hard to tell if you're getting anywhere at all; maybe the code you wrote is necessary, maybe it's isn't, but you won't really know until the full exercise is done. This is especially important for students who are taking longer to finish the exercise. Rather than feeling discouraged, as they would if they had no idea how much progress they had made, they know they are actually achieving something.

All this is based on observing the differences in students' learning and reactions between the exercises with and without unit tests. However, it's worth noting the unit test exercise was the fourth, so by that point the students did have more knowledge than when they started.

You Should Do It Too

The technique was successful enough that I am thinking that all coding exercises that teach a new library or API should include unit tests. When I have some time, I may write a post about some lessons for teachers that I learned watching students solve my exercise. And I would love to hear suggestions from people already using this technique. Test First has some information, but seems to mostly focus on teaching programming languages, as opposed to libraries or frameworks. I haven't yet had a chance to watch the videos, though. I know many others are using this technique as well.
Itamar firstname.lastname@example.com:blogger.com,1999:blog-3067593860715012258.post-80072114758159243022012-11-30T10:17:00.001-08:002012-11-30T10:18:00.089-08:00Cancelling Deferreds, part 2
In my last post I talked about the motivation for cancellation, and how one cancels a Deferred. In this post I'm going to explain how to make a Deferred created by your code do something useful when cancelled.

Let's imagine you are implementing an HTTP client, which returns a Deferred firing with the response from the server. Cancellation is best achieved by closing the connection. In order to make cancellation do that, all you have to do is pass a function to the constructor of the Deferred (it will get called with the Deferred that is being cancelled):

class HTTPClient(Protocol):
 def request(self, method, path):
 self.resultDeferred = Deferred(
 lambda ignore: self.transport.abortConnection())
 request = b"%s %s HTTP/1.0\r\n\r\n" % (method, path)
 self.transport.write(request)
 return self.resultDeferred

 def dataReceived(self, data):
 # ... parse HTTP response ...
 # ... eventually call self.resultDeferred.callback() ...

 Now if someone calls cancel() on the Deferred returned from HTTPClient.request(), the HTTP request will be cancelled (assuming it's not too late to do so). Care should be taken not to callback() a Deferred that has already been cancelled.

As you can see, making your Deferreds cancellable is fairly simple, and the benefits are great: the ability to cancel an operation half-way in a standard manner, freeing up resources that no longer need to be used. In addition, as we will see in my next post, cancellation can be used as the basis for adding timeouts to Deferreds.
Itamar email@example.com:blogger.com,1999:blog-3067593860715012258.post-10879219355859483182012-11-20T07:43:00.000-08:002012-11-20T07:43:07.278-08:00Cancelling DeferredsDeferreds are Twisted's abstraction for result callbacks, encapsulating the result of some asynchronous task. For example, the result of retrieving a web page:

d = getPage("http://www.example.com/")
d.addCallback(gotPage)
d.addErrback(errorHandler)

 What if you wanted to cancel that page download? Perhaps the user hit the cancel button in the application GUI because things were taking too long. To do this, you can call the Deferred's cancel() method:

download = getPage("http://www.example.com/")
# Open a dialog that lets the user cancel the download:
dialog = ModalDialog(message="Downloading...", button="Cancel",
 onClick=download.cancel)
download.addCallback(dialog.close)

 Cancellation of Deferreds is best effort, which is to say it may not actually cancel the underlying operation. This may be the case for a number of reasons:

The Deferred doesn't know how to cancel the underlying operation.

The underlying operation may have reached an uncancellable state, because some irreversible operation has been done.

The Deferred may already have a result, and so there's nothing to cancel.

 Calling cancel() will always succeed without an error regardless of whether or not cancellation was possible. In cases 1 and 2 the Deferred may well errback with a twisted.internet.defer.CancelledError while the underlying operation continues. Deferreds that support cancellation should document what they do when cancelled, if they are uncancellable in certain edge cases, etc..
That's cancellation from the point of view of the caller. In my next posting I will explain how the creator of the Deferred can make cancellation actually do something, e.g. stop an in-progress page download.
Itamar email@example.com:blogger.com,1999:blog-3067593860715012258.post-9152887311091351102012-11-20T07:41:00.000-08:002012-11-20T07:41:40.798-08:00IntroductionFuture Foundries LLC is comprised of Jean-Paul Calderone and myself (Itamar Turner-Trauring). We've been core developers of Twisted for over decade, and started a company together to do Twisted and Python consulting.

Recently I've been working on training material for Twisted, including a discussion of one of my favorite techniques for making applications more robust: Deferred timeouts. Based on the slides I've created I'll start out this blog with some explanations of the Twisted API for Deferred cancellation, and then how and why you should build timeouts on top of it.Itamar email@example.com


text:
This event has been and gone!
Catch the next one:
Check out the info below for future tour dates, and track them to receive alerts when they tour near you
Never miss another 'The Sheepdogs' show
The Sheepdogs
Possibly the hottest band in Canada right now, Saskatewan's The Sheepdogs beat 15 other bands to win Rolling Stones 'Choose The Cover competition in 2011, appeared on Late Night with Jimmy Fallon, performed at the Bonnaroo Music Festival as well The Osheaga Festival in Montreal, and are now signed with Atlantic Records.
The Sheepdogs remember the importance the other elements, aside from the riff, that make for great rock music: melody, harmony and groove. To see them live is pure rock and roll jubilation, to revel in the splendor created by three part vocal harmonies and heavy hitting dual guitar leads
The Sheepdogs tour dates
Track this event
- Event has been added to your calendar
- Any important updates will be sent to your email address
- Add to your personal Ents24 calendar
- Sync with iCal, Outlook and others
- Receive important updates
Join the millions of entertainment fans that trust Ents24
- Get the full picture with the UK's biggest entertainment guide
- Buy tickets from trusted ticket sellers
- Our customers rate us excellent on Trustpilot
Venue Facts
Venue: The Stiff Kitten Bar & Nightclub
Website: thestiffkitten.com
Enquiries: 028 9023 8700


text:
How National Geographic Traveler exposes problematic entries in its photo contest
This is an amazing photo:
The surfer is under water, and yet everything about the image is crisp and clear -- almost as if it was taken above water, where natural light abounds.
The photo was taken on a reef in Fiji by photographer Lucia Griggi and was named a Merit Winner in this year's National Geographic Traveler Photo Contest, which invites people to submit photos that "depict the beauty of the places and people that make traveling memorable."
There were about 12,000 entries submitted by 6,615 people representing 152 countries this year, the contest's 24th. (Both amateurs and professionals are welcome to submit.)
Dan Westergren, Traveler's senior picture editor, has been judging the contest for many years. I asked him how they detect manipulated or otherwise inadmissible submissions among the massive volume of entries.
"Our biggest problems come because people have been a little bit too heavy handed in burning and dodging," Westergren says, noting that outright manipulation is rare. "A lot will oversaturate the picture, or some really like the desaturated look, what the French call 'sub-saturated.' It's easy to fall in love with those pictures because they look cool."
The Traveler contest rules allow for some photo processing techniques that are forbidden in news photos. As a result, it often comes down to a judgment call as to whether a photo has been overprocessed.
Here's what the rules say about what is allowed:
Only minor burning, dodging and/or color correction is acceptable, as is cropping. High dynamic range images (HDR) and stitched panoramas are NOT acceptable. Any changes to the original Photograph not itemized here are unacceptable and will render the Photograph ineligible for a prize.
Westergren says one fundamental question judges ask of every entry is, "Does this picture show what it felt like to be there at that moment, to combine the human elements with the place?"
It's up to the panel of judges to determine if an entry crosses the line by incorporating too much color correction or burning and dodging. They rely on trained eyes to spot a fake or an overprocessed submission. The magazine also follows up with the photographer if a shot seems too good to be true or is in contention for the winner's circle.
Few people submit manipulated images or composites, but it does happen, according to Westergren. He remembers one in particular.
"It was like perfect light on an iceberg and there was a penguin standing there," he says. "People in the room liked the picture and I looked at it and said, 'Look at that edge -- somebody pasted that penguin on there. It's too perfect.' "
Westergren says it's so easy to manipulate and overprocess images that, "You can't really believe much of anything anymore."
"If you have funny feeling, then it's your job to look into that," he continues. "People are very sophisticated and they can get stuff by you."
In the raw
If a submission appears too cooked or on the edge of acceptability, the magazine contacts the photographer to ask for the raw file. This is the image as it was captured by the camera, and before it has been opened in a piece of software like Photoshop, or compressed into a jpeg.
"Another reason why we want the raw file is to see if people are willing to send it," Westergren says.
By comparing the raw file with the submission, the judges can better determine if an entry falls into the accepted range for the contest.
Another technique used in judging is to take the raw file, or a jpeg if that's all that's available, and examine the EXIF data of the file. (I described EXIF data and other tips for spotting manipulated images in this previous post.)
"'[With EXIF data] I can see if it has a believable exposure time," Westergren says. "Also, if something is a true composite there often won't be any camera data ... If camera data is there, I feel a bit more secure."
As for the above winning surfer shot, Westergren says many people may look at it and think something's off.
"It looks off because of how underwater photos looked on film," he says.
We're used to seeing underwater photos that have an abundance of blue. Yet Griggi's photo is well balanced in terms of color.
Westergren says near the top of the image you can see shades of red, which is the result of a color correction process used to restore the surfer's natural flesh tone. He and the judges saw that, but determined the photo was still "a reasonably accurate representation of the scene."
"Can I justify that it isn't so dramatic because it's been cooked?," he says.
Over the phone, Westergren opens the original raw file to illustrate the comparison they used to make their decision.
"Wow, it's pretty nice," he says.
With Griggi's permission, Westergren produced a comparison of the contest entry (left) and the raw file (right):
In Westergren's view, the raw file is very close to the submitted jpeg. The processing was used to enhance what was already there, rather than altering the image.
The result is a striking -- and winning -- image.


text:
News reports are now coming in that Dick Clark has died.
The AP reports that Clark's spokesman has confirmed what TMZ first reported, that the 'American Bandstand' host has died after suffering a heart attack Wednesday morning at Saint John's hospital in Santa Monica, Calif.
In a 1989 Times Union article, Clark spoke about "American Bandstand"
"I can remember the day we went on the ABC network originally," Clark said. "That was very exciting because we'd had a five- year history of (local) success in Philadelphia before then. There were a lot of people who were very skeptical about whether we'd succeed or not on a national level. We had said, 'There is no doubt it will. It will, it will, it will.' And we really believed it would. And it did."
The show with Clark at the helm lasted for 37 years, and in that time Clark had a profound impact on popularizing pop music, and making Americans dance.
In the interview, he said, "I'm the luckiest human that ever walked the face of the Earth. I was blessed with good health and the ability to do what I only dreamed of as a child…. When the day comes for me to check out, or the Lord beckons me to go, they will say something about 'He played the music and the kids danced.' Or, 'He was America's Pied Piper.' … One of the things I hope they will make note of is that we kept the music alive."


text:
- Home
- College (N-Z)
- South Carolina
- Shop By Category
- Baby & Kids
- South Carolina YOUTH Automatic Pullover Hooded Sweatshirt
Ladies stay warm in style with this NCAA Titan pullover hooded sweatshirt from Colosseum. Features embroidered team graphic across the chest contrasting team color hood and a front pouch pocket. Made of 80% cotton/20% polyester. Officially licensed by the NCAA.
Officially Licensed Product By: Colosseum
Related Items
Price: $29.99
Price: $29.99
Price: $35.99
Price: $17.99


text:
To continue with DJ Jazzy Jeff's Vinyl Destination series, here is the second installment, Vinyl Destination: Episode 2. In this episode DJ Jazzy Jeff and his team explore the streets and city life of Hong Kong. Please enjoy another 15 minutes of fun, music, and entertainment. Most importantly, we hope you all continue on this musical journey around the world with DJ Jazzy Jeff.
Previous: Episode 1


text:
- Bamboo shadows sweep the stairs,
Yet not a mote of dust is stirred;
Moonbeams pierce to the bottom of the pool,
Yet in the water not a trace remains.
--from 'The Zenrinkushu
What Karma possibly exists on a national, or international level, among so many various nationalities, races, classes that would be engraved upon the earth like this tsunami from Sumatra?
We can only ask deeply what exergue encrypted somewhere, (where?), upon this colossal work of nature could possibly open the door to understanding "why?" We look for a signature; we look for signs and explanations for this mysterious world-shaking movement of mountains and oceans.
Rather than the mountains walking above the ocean, deep cavernous terrains moved and the ocean walked.
Suffering. After the day of dying of so many, after the initial wave of death had passed, a question formed in my mind: "Can it be that since so many precious human bodies gave up their life spirit, could it be possible for us to sense or feel, know or intuit something grand? Wouldn't this be a time of great awakening for some? Wouldn't it be that some would turn towards the dying and similarly to the practice of Tonglin, breathing in the suffering and death, and breath out light and life?
The answer that keeps coming to me is "yes." It is possible to feel the suffering, loss, and deaths, but from my comfortable western milieu I don't smell the stench of decomposing bodies. However I do see the bodies in photographs. I do not see the signature of a great wisdom hidden on the secret side of the tsunami, the great death; but, I see the moon over the land. In the sunlight the ocean sprang up and scrubbed out lives in the tens of thousands, but by night, there were many grievers, orphans, widows, widowers, stunned and lost persons-all-looking out at the devastation of the tsunami under the moonlight.
I give up trying to find the secret inscription that would give access to the karmic mystery. Instead, I ask myself, what can I do to ease human suffering?
In addition to the obvious prayers, donations, and material things I can provide to the people under this grieving moon, I know this isn't what I'm asking of myself. I am asking of myself to wake up and stop delaying, to be awake to my essential Buddha-nature, and out of that realization, ask, "What can I do?"
I am mystified. I cannot "crack this koan" nor can I find myself a young man, able to fly to Phuket, or Sri Lanka, Ethiopia, anywhere-I'm old, recovering from surgery, home-bound. What can I do? I keep thinking of this "most hidden" and the "finding and realization of that which is hidden which is most precious of all." Where does this come from? Why do I want to uncover the hidden mysterious element of this disaster and grand death?
It is on the Internet that I find I can follow the unfolding of the day, and then the sunset, the devastation under the tsunami moon, and on the Internet I learned early one morning, perhaps 2 or 3 a.m., that there had been an earthquake and 300 persons were thought dead. I knew, intuitively, at that instant, that the death toll would be astronomical-why did I know, I can't say. I followed the Internet readers' "votes" for "how much did you like this article?" to move from 2.3 on a scale of 5 when the death toll was 300 to 3.9 when the death toll was 70,000. I couldn't understand why no one was giving this amazing story a 5? I did. I began to realize that lethargy, boredom, habit, and insensitivity to suffering, was more tragic than their loss. Insensitivity is a very real and tragic consequence of material attachment.
So, trapped in my materialistic western (luxurious middle class home) I took my "search for the hidden" my detective-work to find the exergue, the signature of the smith engraved on the flip side of the world.
I found a site where the AP (Associated Press) posted hundreds of photographs. Amazing photos of women bowing down so low to the ground that their breasts were pressed against the earth between their squatting legs, and their hands turned up, open palmed, to the sky, crying for mercy from god. I found pictures of mass graves. I found photos of boats pilled upon buildings, and saw walls of photographs of the dead posted so their mourning families could learn whether they were known dead or alive.
It was the sight of so many men in Thailand out in the water, after the tsunami had run it's course, that caught my eye, first. Why were these men swimming? Then, I saw one man's face as he bobbed up from the shallow water off Patong beach: he was looking for the body of his beloved who had been washed away. There was not one man like this bobbing for bodies, but hundreds. I began to feel that I needed to be involved.
I kept looking through the photographs online studying the suffering faces and looking at the debris from so many lost lives. Then I saw a boy, about 8 or 9, perhaps older, holding up a sheet of paper with his hometown and his parents' names on it. He had a stoic, sucked-in and tight-lipped, countenance that betrayed his total loneliness, shock and fear. He had lost his parents and his brothers. A photographer acted as his bodhisattva for a moment, letting this blond boy from Sweeden get his message out to the world. And here was his face with his message, posted for all to see on the Internet.
I saved his photo. I had saved many, thinking I would study this later and try to find the meaning of suffering, the meaning of the secret hand inscribing this tragedy upon mankind, later…yes, I'd study later. Then my Chan training kicked in and shouted to me, "NOW!"
I went back to the picture. The boy's name was Karl Nillson. His home was written as Lulo, Sweden. I decided that this was enough of a hidden mystery for me to enter into the work of solving it. I still am working on it, but I am sharing this now. Who knows, someone in Sweden will perhaps come by our Internet sangha.
An Internet search didn't yield a "Lulo" Sweden, but I finally found that there was a similar name, and so I began searching for embassies, and aide organizations. In the 1960's many refugees from Tibet, fleeing China's fist, settled in Switzerland and Sweden - about 40 Tibetan's in Sweden make up the TCS, Tibetan Community Sweden. I sent email out to the Swedish embassy, and to volunteer Swede groups, announcing this boy's particular suffering, his need. I checked off "send receipt when email is read" so I'd know when it was received. Only one person replied so far: That person was Chuan Zhi.
So, I ask you, as a friend along the way, do you see the need to respond to this human suffering? I can only see how to help one person at a time. I'm afraid that the emphasis on massive relief operations, massive shipments, and massive bank deposits won't reach the orphan. I ask that we all think how he saw Phuket, Thailand under the moon after the tsunami passed? He had seen the truth of suffering, and impermanence: Annica.
Will Karl Nillson, and so many of the other orphans be forgotten while the giant planes land and take off, while the nations sprinkle a few million dollars on this scene? Can money alone solve the problem of mankind's plight?
Can one person, through compassion focused on relieving the suffering of this boy, manifest Buddha-nature in an instant? Through the unified good will of us all, can we help this boy's tsunami moon become the light of enlightenment?
Or shall he perish?
We go through life in small steps. I am now going to return to my emailing of anyone who might be able to touch this child's life. I will begin searching through the other faces, the individual faces on the Internet and try to bring these children home. I'll let you know if I get any replies to the emails.
Latest developments: 12-30-04
I posted a message on a Phuket website ( http://www.p-h-u-k-e-t.com/ ) that I was trying to locate Karl Nillson to help unite him with his family. A dear native of Sweden posted a reply that he had been returned to Sweden to his grandfather. There is an article in the Swedish press at http://expressen.se/index.jsp?a=223426.
If we are all One, then the tsunami didn't just wash natives and tourists out to sea. The suffering of strangers is no different from our own suffering in samsara. The tsunami washed us all together, as One, out to sea.
What will become of us next in this vast ocean of life and death?
- No man is an island, entire of itself; every man is a piece of the continent, a part of the main. If a clod be washed away by the sea, Europe is the less, as well as if a promontory were, as well as if a manor of thy friend's or of thine own were: any man's death diminishes me, because I am involved in mankind, and therefore never send to know for whom the bell tolls; it tolls for thee.
John Donne, from Meditation #17


text:
Oastler Targets First Team Spot
Reserve team captain Joe Oastler speaks regarding his release from Portsmouth and his ambitions at Queens Park Rangers.
Young defender Joe Oastler has come a long way since his release from Fratton Park last summer, a move which left him crestfallen and left him contemplating his future in the game.
After ten years with his home-town club along with being a season ticket holder, Joe questioned his future before signing for Queens Park Rangers, in the midst of interest from 13 other clubs.
'Being released by Pompey was devastating and afterwards a few times I felt like giving up - but things couldn't have turned out any better. he told the Portsmouth News.
'QPR picked me up at the Exit trials and put me with the youth team.
'Two days later I was told to train with the first team, given a squad number and stayed with them for the rest of the season."
Joe, who Rangers picked up training with non-league Bognor Regis Town, was one of only two players who trained with the first team. He and fellow defender Lee Brown were invited to train by Gareth Ainsworth who also gave Oastler the captain`s armband for the reserve team campaign.
The defender put in some excellent displays in the second string, and the experts say he isn`t far away from a first team appearance as he vies for the attention of new boss Jim Magilton.
'It's all happened so quick. I cannot remember much of the season, it flew by, he said.
'I definitely feel I've improved. I've been on a weight programme which has really built me up and feel much better when playing now.
'The next aim is to start making some first-team appearances. We're back to training on July 1 and I'm really excited with a new manager (Jim Magilton) to impress."
With regards to first team affairs and Oastler is confident that QPR can achieve promotion - if the squad can perform to the best of their ability.
The R`s finished 11th in the Championship under the guidance of caretaker boss Gareth Ainsworth. Now former Ipswich boss Jim Magilton and his assistant John Gorman have taken the helm at W12 there is renewed vigour and ambition at Loftus Road.
Oastler continued: 'There are a few big clubs in there now and I think with the squad we have got we are good enough to get promoted,
'If we can get it right we can definitely challenge.'
Oastler was given the number 28 squad number vacated by defender Zesh Rehman after he left for Bradford City on loan towards the latter stages of last season.
Have your say on The Forum
Follow us on Twitter
Become our friend on Facebook - Add Vital Queens Park Rangers


text:
Long gone are the days of chefs guarding their culinary secrets with their lives. We're living in the age of gastronomic collaborations, where the country's top cooks are happy to team up and create beautiful food together. This swapping of ideas, ingredients and techniques has helped give birth to new dishes, restaurant concepts and events – one of which is Alyn Williams' CHEFStock.
This four-night mini-festival sees Michelin-starred chefs from all over Europe come to Alyn Williams at The Westbury in Mayfair to create a series of one-off tasting menus every Tuesday throughout April. Taking part are Nigel Haworth of Northcote, Marc Wilkinson of Fraiche, Sasu Laukkonen from Helsinki and Riccardo Camanini of Italy's Lido 84. We caught up with Alyn to see what it's like working with new chefs.


text:
Despite heady anticipation, Saturday's pair of qualifying finals did not disappoint in the slightest. Two compelling contests determined the final four of this year's Super 15 and the cream has now risen right to the top. A pair of delicious domestic battles comes next. Semi-final weekend is just around the corner.
Chiefs v Crusaders
First up on Friday evening, all eyes will be fixed on Waikato for a simply mouth-watering all-Kiwi tie. Typically clinical in Christchurch against an ill-disciplined Bulls side, the Crusaders are clearly desperate to banish the pain of a final-hurdle stumble last campaign. However, some quality compatriots stand in their way.
As the pace-setters for the majority of the regular season and champions of the New Zealand conference, the Chiefs have every right to be confident. Aaron Cruden and Sonny Bill Williams possess box-office brilliance in midfield, and the latter will be especially keen to excel before heading off to Japan.
Elsewhere, Liam Messam and scrum half Tawera Kerr-Barlow are both in sublime form. Dave Rennie will hope that his charges have exorcised any mental demons lingering from back-to-back defeats – to the Crusaders and the Hurricanes – during a well-deserved week off.
For the seven-time champions, Richie McCaw continues to deputise for the injured Kieran Read at the base of a very solid scrum. Along with a dynamic duo of fantastic locks – Sam Whitelock and Luke Romano – the All Blacks' captain fantastic will fight tooth and nail to establish a platform for his backs. From there, Dan Carter and co. can prosper.
Coming together for the second time in only three weeks, both teams will tussle for territory in the early stages. You can be certain though – given the reams of running talent on show – that the clash will explode into life at some point. The Crusaders emerged victorious last time, snatching a 28-21 win. I expect something similar. Crusaders by 5
Stormers v Sharks
Extinguishing the Australian challenge with a magnificent display at Suncorp Stadium on Saturday, the Sharks made a total mockery of my prediction. In a breathtaking first quarter, they counter-punched with lightning speed and ferocious power to dismantle a hapless Reds outfit. Now, though, a far more formidable defence lies in wait. The table-topping Stormers complete the semi-final line-up.
Newlands has proved to be an impregnable fortress for this season and, relying on a direct, uncompromising approach, Allister Coetzee's men are unbeaten at home. As they keep getting reminded, though, they have not yet recorded a four-try bonus point in 2012. While their position in the overall log is a glowing testimony of a tenacious winning mentality suited to knockout rugby, now would be a fantastic time for Peter Grant to extract some spark from a backline brimming with Springboks.
On the evidence of last weekend, the Sharks have the balance of their selection sorted, especially up front. From the du Plessis brothers through to a tremendous back-row trio – Marcel Coetzee and captain Keegan Daniel were especially effervescent at Suncorp – the pack is a veritable powerhouse that will not take a backward step. Outside of that, half-backs Charl McLeod and Freddie Michalak are forming a great understanding.
Head coach John Plumtree has already expelled the notion that a tough fortnight of travel could affect the Sharks. "It is always nice to come home," he told the club website. From a neutral's standpoint, I agree with him. With national bragging rights at stake, this should be something special.
Two nail-biting fixtures between these two earlier in the year – a 15-12 victory for the Stormers in Cape Town and a 25-20 victory for the Sharks at Kings Park – confirms just how close this could get. For me, the visitors' momentum holds the key. Sharks by 3


text:
Copyright Concerns
Rules of Thumb
A) If you created the image (not just digitized it):
you are free to use it internally to Wheaton and externally.
B) If you found or digitized the image…
…And you plan to reuse the image, not created by you, for papers/presentations for class, internal to Wheaton, you are probably allowed to do so, under Fair Use.
…And you plan to publish or distribute your paper/presentation, or post it to the web, you should seek out permission to reuse the image, unless you are certain that it is Public Domain or has been expressly made available under a Creative Commons license.
Presenting Images
ARTstor allows you to link directly to their individual images on the web. You may also download their images and combine them with others that you have found or created, as an offline presentation – using Microsoft PowerPoint, Apple Keynote, ARTstor's Offline Image Viewer, etc. Again, any reuse of these images should be reviewed with the copyright concerns listed above in mind.
Grouping, Linking, and Downloading
- ARTstor
Offline Presentation Software
- Inserting images into Microsoft PowerPoint
- Inserting images into Apple Keynote (video)
- Inserting images into ARTstor's Offline Image Viewer
Need Help with Images?
Contact: A research liaison
More Copyright Info
(American Library Association)
Digital Image Rights Computator
(Visual Resources Association)
Wheaton Copyright InfoDescription of Using Images & Copyright (Artstor)


text:
★ Cute
Hungry Zoo
What is it about?
★ Cute! Block Game ★
App Screenshots
App Store Description
★ Cute! Block Game ★
Do you love animals? Then there is the perfect career for you! And it's just zookeeper.!
The mission given to you as the youngest zookeeper is to give some food up to 8 kinds of young animals.
Do you think that baby animals always look so cute? Soon it is their mealtime.!
Be nervous! Baby animals have a good appetite and that amount will increase gradually.
★ Features ★
- This Game is to arrange blocks horizontally or vertically into 3 or more of a kind.
- Simple and easy way to play & control the game.
- 8 cute animals' characters have the interesting changes in their expression.
- Various items to enjoy this game easily.
- Provides the excitement and an opportunity to make a high mark through combo system.
- Supports a self-developed ranking system.
- If you tap "More Games" button, you can meet GameAgency's games.


text:
games you've played
will be shown here.
Have Fun!! :)
Radd/Ladd Spencer sports a gun with one hand and an extendable bionic gripper device on the other. His bionic arm can be extended and rotated in 45-degree increments, from horizontally left to directly upwards to horizontally right. Once attached to something, Radd can pull himself to wherever the arm has latched, typically leaving him swinging back and forth under the point of connection. From this position, he can swing off or hoist himself up to the point of connection. Radd's bionic arm can also deflect some types of bullets and grab certain enemies and items.
Download Bionic Commando ROM to PC


text:
Houston Baptist University academic excellence
Think about what career is best suited for you, and where you want to study. Request more information now.
Think about what career is best suited for you, and where you want to study. Request more information now.
Think about what career is best suited for you, and where you want to study. Request more information now.
Find information about Houston Baptist University academic excellence, and registering for elective seminars and discussion sections. As a student, your first stop should be the registrar's office, where you can pick up a free copy of both the academic calendar and course catalog, in order to find available credit classes that you may be interested in taking. In-person class registration has largely been replaced with online sign-up, and many schools offer mobile apps that streamline the course registration process. Finally, check with the admissions office for assistance with prerequisites, tuition payment deadlines, and Houston Baptist University class registration information. Please use the form above to request admissions info for Houston Baptist University.
Research demonstrates that college freshman taking a full courseload go on to complete their degrees at a much higher rate than those students who study part-time. When choosing a major, plan ahead and be sure that you are picking courses that will meet transfer requirements of other colleges and universities later on. Further, by choosing your major early, you may be able to take some required core classes in a community college, saving both time and tuition fees.
Look at all the schools in your state first, as in-state tuition may be lower for state residents. The course catalog will outline which classes are required for a particular major, and what minimum GPA you'll need to maintain your class standing. Please contact the academic advising staff at the school you are interested in applying to about their specific course registration guidelines. Beyond degree requirements such as Houston Baptist University academic advising, you may consider Cedar Valley College assessment tests for complementary electives to your primary course of study.
Advisor and Program Manager
Tarleton State University
Participates in institutional service roles such as but not limited to, college committees, club sponsorship, and advisory committees.
4 days ago Staff Assistant III
Harvard University
College degree preferred. Assist with coordination of faculty search and graduate admissions candidate visits..
4 days ago Director of Admissions
Education Corporation of America
Director of Admissions. Then consider joining us at Brightwood College. You will have interaction with the SVP of Admissions and the Regional Group President..
1 day ago Testing Center Proctor
Bryant & Stratton College
Administers College Success/English entrance exam. Update and maintain testing forms for admission reps.
1 day ago Admissions Recruiter
Crescent Academies LLC
Attending college nights; Discerning the appeal of admissions literature; Qualifications At least, two years admissions experience in a postsecondary setting.
6 days ago


text:
I call myself decent at remembering birthdays, but I'm terrible at remembering dates of tragedies. I suppose this is mostly a good thing. However, Facebook Memories was here to remind me at 3am when I woke to let the dog out that 5 years ago today, I was lying in bed beside my grandmother, Mia,…Read More
5 years without Mia
By: Melissa
Assorted, Design, Friends & Family, Memory5 years later, Arthurs Wine Shop, Belk South Park, bird bath, Carolinas Medical Center, Charlotte, Charlotteans, CMC, coffee, CVS, Dad, Hersheys, Iowa, Josie, kegal exercises, Kevin, Lake Wylie, Mia, mini cooper roadster, mom, mowing grass, pacemaker, puzzle, South Park Mall, sunrise, texting and driving, weeding2 Comments on 5 years without Mia


text:
Our Services
Know More
VAT refund
Re-issue/restyling invoice
Obtaining the certificate
VAT registration
Our Fee
About Us
BT Associates' Formation
Your Comments or Requests
Dutch Vat
EU Vat Committee
EU Vat Database
VAT Retail Export scheme
How the new EU VAT rules and MOSS will affect you
Seminar on the Impact of the Unified Statute on the Competitive Position of the Belgian Labour Market
Tax Season 2014 Witness the Disappearance of Various Popular Tax Breaks
Identity Theft: A Top Priority for the IRS
Who Needs to File VAT Returns
Ed Miliband Claims Tax Rises to Eliminate Deficit
The EU Response to the (Indirect) Taxation of Digital Economy
PwC to Present Proposal of the European Commission on a Standard VAT Return
New Tax Reliefs for Home Renovation
Taxation of Green Fees Could Lead to Refund
HMRC's Consultation to Assist Businesses to File Their VAT Returns Online
European VAT Verdict- A Matter Concern For ETOA
TMF Group Releases 2014 EU VAT Trend Tracker
Brief Overview of Eu Vat Refund
EU Plan to Slat VAT on Food
EU plans for a radical tax shake-up could cost struggling families and pensioners £800 a year...
Hungary's Collision Course With the EU
Since assuming power with an overwhelming parliamentary majority in May 2010, the Hungarian government of Prime Minister Viktor Orban has adopted...
Interest on overpaid VAT unlikely to be reclaimable
The opinion of an Advocate General in the Court of Justice of the European Union makes it unlikely that much of the billions...
Irish PM optimistic about latest EU-IMF review
Irish Prime Minister Enda Kenny said Monday he was confident of a positive outcome from the latest review of the country's...
Jersey raises stamp prices to combat VAT loophole closure
Jersey Post has gained permission to raise stamp prices later this year, as the Channel Islands prepare for the impact of the ...
Reforms in EU VAT - Lessons for the Indian GST
The previous two articles in this column had discussed the Communication on the future of VAT in the EU...
1st November 2010
EU safeguards Taxpayers' right to VAT Refunds
2nd November 2010
New Deadlines for the 8th directive Claims
2nd November 2010
VAT Commission launches infringement proceedings against Poland and Portugal
4th November 2010
EU takes control of VAT Recovery
4th November 2010
Change to VAT rules to impact MICE Business
5th November 2010
Romania govt fights to defend IMF reforms
5th November 2010
Another Irish lesson fail
5th November 2010
EU Comm:Survey Shows EU Citizens Want Stronger Economic Rules
7th November 2010
Time to Put a Stake Through the Heart of Pork Bellies
8th November 2010
Hungary watchdog sees 2010 budget gap above target.
8th November 2010
Road bikes grow in popularity as upcoming VAT rise causes consumers to tighten there purse.
9th November 2010
E-Commerce: is Europe behind or just different?
10th November 2010
UK VAT Hike To Have 'Minimal' Impact On Retailers
13th November 2010
France exploring tax harmonisation with Germany
15th November 2010
Action must be taken as confidence in carbon trading is at 'low ebb'
15th November 2010
Government petition response ignores VAT reduction
17th November 2010
The political annulment of the VAT growth decision would have blown away the IMF agreement and the state budget
17th November 2010
Crackdown on carbon credit scam
19th November 2010
The shape of Bulgarian things to come
19th November 2010
Athens must embrace austerity to satisfy Troika
20th November 2010
HMRC Backs Down In Insurance VAT Fight
20th November 2010
EU says no change in broadband bills
20th November 2010
Economic Growth Gets Back On Track
20th November 2010
End To reshuffle Scenario
22th November 2010
Greek traders fear 'A-bomb' effect from austerity tax hikes
24th November 2010
Net Neutrality is an important resource for e-Government
24th November 2010
Shortfall between government revenue, expenditure declines
24th November 2010
Vodafone to issue mass refunds after billing blunder
29th November 2010
ETOA calls for tax and visa changes to boost UK inbound tourism
30th November 2010
Pricing study claims online retailers offer better value than tax free