text:
- web2py's only knwoledge about table structure is from web2py itself.
to be more specific, from the files created in the folder databases in side web2py's main directory.
If you change the tables outside web2py, web2py gets confused, and you have set migrate=False.
- If your database connection is not established, even by specifying the right connection string, make sure you've specified the right port in the connection string, your database may be running on a different port other than the default one.
- to use a field of type reference, you've to reference another field in a table existing in the same database, you can't reference a field in a table in another database, use field of type 'integer' instead and becareful with your queries.
- It is actually easy to add a new DB. everything is one file gluon/sql.py
- find a python module that interface to MaxDB
- identify the connection strings
- add translation strings (to of the gluon/sql.py) file
- run the tests (python gluon/sql.py)
So you can make something like:
dbref=db qry=db.address.customer==2 fields=['number','city','state'] sel=[db.address[field] for field in fields] rows=dbref(qry).select(*sel) # note the *
row=db((db.people.name==request.args(0))& (db.people.company_id==db.company.id)).select().first() people_name=row.people.name company_name=row.company.name
Notice that you can can also define :
people_and_their_companies=db(db.people.company_id==db.company.id) row=people_and_their_companies(db.people.name==request.args (0)).select().first()
and wow !!! congratulations you've just made an automatic inner join :
then you can do :
people_name=row.people.name company_name=row.company.name
Do something like this:
fields=[Field('addr%02i' %i,'string') for i in range(21)] db.define_table('name',*fields)
only one app should have migrate=True so you know who is altering tables. It is not necessary that all apps have the same define_table as long as each define_table defines a subset of existing fields.
This is not a problem as long as migrate=False.
If you want one app to change a table definition and all apps to
reflect that change, yes, you have to change them all.
This is because changing the table definition may break an app.
Difference between requires, required, and notnull
enforces validation on the form level.
Most of us are well experienced with it, so no need for more talking about it.
# model db.define_table('my_table', Field('soso', 'string', notnull=True)) #controller def index(): form = SQLFORM(db.my_table) if form.accepts(request.vars, session, dbio=False): db.my_table.insert(soso=None) response.flash = T('Accepted') elif form.errors: response.flash = T('Not sccepted') else: pass rows = db(db.my.id>0).select() return dict(form=form, rows=rows)
In this example, I used dbio=False with the accepts() function to make automatic database manipulation stop.
Now, I've full control to do what I want to do.
Trying to do:
while using notnull=True, in table definition in my model, will cause the database to refuse the insertion and you'll get the error flash message:
'not accepted' as well as an error message 'enter a value'.
This shows you that this validation is enforced on the [database level].
In fact if you changed the code to :
...... if form.accepts(request.vars, session): response.flash = ... elif form.errors: response.flash = ... else: pass
You'll get the same error when trying to submit the form without any value in it.
In the former example using dbio=False even if you're inserting any value it will fail since am always trying to insert Null into the database field using insert() manually.
I just wanted to show you that validation is enforced on insert() and on database not form.
Is enforced at the level of db.table.insert, tells web2py that some value (including "" and Null) has to be specified.
So the database will accept Null values and empty strings.
#model db.define_table('my_', Field('soso',required=True), Field('toto'), Field('lolo')) #controller def index(): form = SQLFORM(db.my_) if form.accepts(request.vars, session, dbio=False): db.my_.insert(soso='') # ok db.my_.insert(soso=None, lolo='ss', toto='') #ok db.my_.insert(lolo='ss', toto='') # Not OK 'required field not specified' response.flash = T('Accepted') elif form.errors: response.flash = T('Not sccepted') else: pass rows =db(db.my_.id>0).select() return dict(form=form, s=rows)
In the previous example, you see that a required field has to be specified when ever using insert statement.
Using db.executesql()
Sometimes you just need to execute sql your self, then db.executesql happens to be handy in those situations.
rawrows=db.executesql(yoursql) -> returns [(col_name, value), ((col2_name, value)), ((col3_name, value))]
Notice that rows are not parsed therefore you cannot say
rawrows[i].colname but you have to say :
rawrows[i][j], where j is the col number as returned by the query.
This may seem confusing in the beginning but in fact if you made something like:
r=db.executesql('select cola,colb from mytable;')
r[0][0] is cols and r[0][1] is col b. It does not matter in which
order they were in the table definition[All that amatters is the order with which you made the query].
#model db.define_table('my_table', Field('soso'), Field('toto'), Field('lolo')) # supposing you've entered data[soso='a', toto='b', lolo='c'] in table fields using appadmin interface . #controller def index(): r = db.executesql('select soso, lolo from my_table') print r # [(u'a', u'c')] print r[0][0], r[0][1] #a c return dict()
One thing to note when using executesql, is that you need to escape strings so that you're not vulnerable to sql injection attacks.
though, when you're using DAL functions, you don't need to do this since it's automatic.
You can do things like:
orderby=db.table.field.upper() #or orderby=db.table.datefield.month()
Can I have a random orderby directly using web2py DAL?
yes, use :
Interesting right ? 😀
An example showing how can indexes speed things up
I defined a model with two tables, let web2py create them (tried this
with both sqlite and mysql), and then imported data (about 1,400 rows
and 140,000 rows, respectively) into the tables using external
scripts. After doing so I found my app became very slow – it took
10-15 seconds to respond. Then I tried the csv import function in
web2py, which worked, and there is no slowness at all. Why does this
The one thing that can make it slow is the absence of indices. You
need to create indices on fields you use for searching. If you use
sqlite you can do, after define_table:
db.executesql('CREATE INDEX IF NOT EXISTS ON table colname;')
For postgres, mysql, and oracle you are better off creating the index
outside web2py.
What else other than not creating indexes when I've a big number of records could affect the performance of my database ?
If you're making joins using the native SQL syntax ma be using executesql(), then , the db may be performing your joins
in the order you've specified. This is a SQL standard, and in those cases there will not be any optimizations. Therefore, when ever you think about making joins using Traditional SQL, make sure that you do the most discriminating joins first (the ones smallest set of results).
Using DAL: The query planner in the db may be optimizing the query for you and order of joins isn't so important.
What would be the simplest way to create an entry form for a new record, pre-filled with the fields from another record in the same
table (knowing that record's id) ?
and the id of the source record is source_id, you can do:
# get the record row=db(db.mytable.id==source_id).select().first() # set the default for all fields by ID for fieldname in db.mytable.fields: if fieldname!='id': db.mytable[fieldname].default=row[fieldname] form=SQLFORM(db.mytable)
Can you give me some examples on using (joins) in DAL ?
Given :
db.define_table('children', Field('user_name' )) db.define_table('child_profiles', Field('child_id', db.children), Field('first_name' ), ...) db.define_table('buddies', Field('buddy_id' , db.children),Field('child_id' , db.children), ..)
You can do :
child_id=....(may be request.args(0)) #or anything else according to the logic you're using in your application. rows=db(db.buddies.child_id==child_id) (db.buddies.buddy_id==db.child_profiles.child_id).select(db.buddies.ALL) # db(cond1)(cond2) is the same as db((cond1)&(cond2)) rows=db(db.buddies.child_id==child_id) (db.buddies.buddy_id==db.children.id) (db.buddies.buddy_id==db.child_profiles.child_id).select() for row in rows: print row.childer.user_name, row.child_profiles.first_name
I have 2 tables, "owner" and "dog". The "dog" table has a many to one relation to owners. If I have an an owner id, how can I make a join based on the owner id?
I did this:
present_owner = db((db.owner.id==session.user_id) & ( db.dog.owner_id==session.user_id)).select()
But when I wanted to retrieve data it traced back, for example:
What is the proper way to retrieve the data from the join?
* For your query to look more like a join, you may rewrite it as :
rows = db((db.owner.id== db.dog.owner_id) & ( db.owner.id==session.user_id) ).select()
rows now contain:
owner = rows[0].owner (rows.first().owner) # an owner dog = rows[0].dog (rows.first().dog) # a dog that belongs to that owner. # then you can get more info using owner.name, dog.name, .......
Q: How 2 make 2 inner joins using the following tables?
db.define_table('table1', Field('name')) db.define_table('table2', Field('table1_id', 'table3_id')) db.define_table('table3', Field('name'))
Ans :
rows= db((db.table2.table1_id==db.table1.id)& (db.table2.table3_id==db.table3.id)).select() for row in rows: print row.table2.id, row.table1.name, row.table3.name
Yes, web2py does left outer joins.BUT they require an explicit "left" keyword otherwise you're trying to make an inner join.
no need for right joins since the functionality is the same as left joins .
You can check the manual for discussions and examples about that .
In fact, you could do something like:
db.define_table('action_queue', Field('user_id','integer')) db.define_table('unprocessed', Field('action_queue_id','integer')) db (db.action_queue.id==db.unprocessed.action_queue_id).select (left=db.unprocessed)
BUT : This is an old notation which is supported only for backward comaptibility and works on sqlite. It should be:
db ().select(db.action.ALL,db.unprocessed.ALL,left=db.unprocessed.on (db.action_queue.id==db.unprocessed.action_queue_id))
q = using db()._select() print q
you can get the real SQL query used by DAL to perform some sort of selection .
Using the same concept suppose you've :-
db.define_table('a', Field('f1')) db.define_table('b', Field('f1'), Field('f2')) # a includes the following records: a.id a.f1 3 1 4 2 5 3 6 4 # b includes the following records: b.id b.f1 b.f2 3 1 y 4 4 x
Now suppose you want to perform the following query :
SELECT b.f2 FROM b WHERE b.f1 IN (SELECT a.f1 FROM a);
So what to do ?
you've 2 options :
- using :
db.executesql('SELECT b.f2 FROM b WHERE b.f1 IN (SELECT a.f1 FROM a);')
- Generate the sub-query using db()._select(), then use it in another query using DAL syntax :
def index(): q = db()._select(db.a.f1) rows = db(db.b.f1.belongs(q)).select(db.b.f2) print db._lastsql return dict(rows=rows)
great !!! and db._lastsql will print exactly the same query you' wanted:
SELECT b.f2 FROM b WHERE b.f1 IN (SELECT a.f1 FROM a);
and the answer is :-
b.f2 hamdy x
belongs can accept a set or a "select…" string and _select() as you may have noticed creates a query string.
I've got three tables: "companies", "region", and "items".
In "companies" there is a "region_id" column. In "items" there are "companies_id" and "price" columns. Is there a simple way to select the top 10 companies which belong to a particular region and whose item prices sum to the highest amount?
First, check the "Grouping and counting section in this chapter of the manual"
Try this: rows=db(db.companies.regio_id==region_id) (db.items.company_id==db.companies.id).select(db.companies.ALL,'sum(items.price)',groupby=db.items.company_id,orderby='sum(items.price) desc',limitby=(0,10)) for row in rows: prin row.companies.name,row._extra['sum(items.price)']
A better way to do it a more recent way actually[the previous will work and still work for backward compatibility]:
you may make:
summation = db.items.price.sum() ..... .select(db.companies.ALL,summation,groupby=..... for row in rows: prin row.companies.name,row._extra[summation]
The first method is always there to help if the function you're trying to use is not implemented(yet) in web2py.
in fact doing something like:
str(db.table.field.max()) # assuming field is numeric
will print:
Wooooooooooooooow, so they're the same
So To understand this, I'll summarize:
some backend SQL DBMS support some functions and don't support others
if function is supported by all backend DBMS supported by web2py, the function will easily be implemented as:
if not , you can still use it [assuming you know what to do and the DBMS you'll always use support it]
using a query string directly that specify your query
So in the following example, you'll get things better :
I'm using web2py with PostgreSQL. I can use 'like' and 'belongs' to construct simple SQL query, but I didn't find anything equivalent to regular expression matching operator ~ or ~*. Did I miss something here? Or do I have to use Python to do regex on results returned from SQL?
The fact is that postgresql supports it but many backends do not therefore there it no API for it. You have two choices :
write the query in SQL:
query="table.field SIMILAR TO '(a|b)'" rows=db(query).select(db.table.ALL)
do the pattern macthing in python on the returned values :
r=re.compile('(a|b)') rows=db().select(db.table.ALL) rows.response=[x for i,x in enumerate(rows.response) if r.match(rows[i].field)]
Take another example to make sure you got all this stuff ? OK and you're welcome
Assuming I'm having:
# Model:- db.define_table('members', Field('name')) db.define_table('resources', Field('resource_tier', 'integer' ), Field('resource_amount', 'integer')) db.define_table('deposits', Field('depositer_id', 'reference members', requires=IS_IN_DB(db, db.members.id, '%(name)s')), Field('resource_id', 'reference resources', requires=IS_IN_DB(db, db.resources.id)))
How can I translate this kind of sql statements:
SELECT members.name, sum(resources.resource_amount) FROM resources, deposits, members WHERE ((members.id=deposits.depositer_id AND deposits.resource_id=resources.id) AND resources.resource_tier=0) GROUP BY deposits.depositer_id;
summation = db.resources.resource_amount.sum() rows = rows=db((db.members.id==db.deposits.depositer_id)& (db.deposits.resource_id==db.resources.id)& (db.resources.resource_tier==0)).select(db.members.name,summation ,groupby=db.deposits.depositer_id) for row in rows: print row.members.name,row._extra[summation]
Now time to another question on the same example:
How could I translate this to web2py syntax ?
SELECT members.name, SUM(resource_amount*(1-ABS(resource_tier))), SUM(resource_amount*(1-ABS(resource_tier-1))), SUM(resource_amount*(1-ABS(resource_tier-2))) FROM members LEFT JOIN deposits,resources WHERE (deposits.depositer_id=members.id AND deposits.resource_id=resources.id) GROUP BY members.name;
member_depositer=(db.deposits.depositer_id==db.members.id) deposited_resource=(db.deposits.resource_id==db.resources.id) sqlrows=db(member_depositer&deposited_resource).select(db.members.name, 'SUM(resource_amount*(1-ABS(resource_tier)))', 'SUM(resource_amount*(1-ABS(resource_tier-1)))', 'SUM(resource_amount*(1-ABS(resource_tier-2)))', groupby=db.members.name,left=(db.deposits,db.resources)) print sqlrows
Having 2 fields of type datetime, How can I order records according to the difference between them?
rows = db ((db.ck.user_id==session.userid) & (db.ck.c_time>d1)& (db.ck.c_time<d2)).select (db.ck.ALL, db.c.ALL, left=db.ck.on (db.ck.id==db.c.ck_id),orderby='DATEDIFF(c.c_time, ck.c_time)') for row in rows: print (row.c.c_time-row.ck.c_time).days
DATEDIFF() should be supported by your dbms
db.define_table('flowers', Field('name'), Field('category'), Field('price', 'float'), Field('quantity', 'integer'))
I want to create a column called TotalPrice that multiplies price and quantity.
TotalPrice='price*quantity' rows=db().select(db.flowers.ALL,TotalPrice,orderby=TotalPrice) for row in rows: print row.flowers.name, row._extra[TotalPrice]
What to do to implement my own function ?
Ah ….. Looking at sql.py, I found that very easy ….. that's why I like web2py 😀
This example should make things clear
db.define_table('koko', Field('toto', 'integer')) db.koko.lolo.insert('toto=5') db.koko.insert(toto=10) from gluon.sql import Expression ex = Expression('toto*5', type='integer') def mulby5(): return ex db.koko.toto.mulby5=mulby5 rows = db(db.koko.id>0).select(db.koko.ALL, db.koko.toto.mulby5()) for row in rows:print row.koko.id, row.koko.toto, row._extra[db.koko.toto.mulby5()] 1 5 25 2 10 50
You can get things done with using 'Expression', just make the function return the the string directly.
1 thing to Note though, because you've added to the Rows object resulting from the query an extra payload, then when you want to select a field from it , you should specify the table name explicitly.
Update record/records
You can use :
db(condition).update(my_field=value) # db() is a Set object and you'll end up manipulating the field 'my_field' in all records in this set with the specified 'value' # set
you can update only one row [one selected row] using the update_Record function.
rows = db(...).select() for row in rows: row.update_record(my_field=value) # or db(...).select().first().update_record(my_field=value)
So Remeber :-
Set.update() row.update_record()
# model db.define_table('node', Field('article_id'), Field('rgt', 'integer')) db.define_table('comment', Field('article_id', requires=IS_IN_DB(db, db.node.article_id)), Field('lft', 'integer')) # data inserted in db tables node.id node.article_id node.rgt 10 1 1 11 2 2 12 3 3 comment.id comment.article_id comment.lft 8 1 1 9 2 2 10 3 4 # code in controller: for row in db((db.comment.article_id==db.node.article_id)& (db.comment.lft>=db.node.rgt)).select(db.comment.ALL): row.update_record(lft=6) # result comment.id comment.article_id comment.lft 8 1 1 9 2 2 10 3 6
In fact as some of you may have not noticed ….. db(….=….) makes an automatic join so doing something like:
rows = db((db.comment.article_id==db.node.article_id)& (db.comment.lft>=db.node.rgt)).select()
you'll never be able to make something like:
for row in rows: row.update_record(..=...)
why ? because in this case you'll have an automatic join and you'll end up with something like:
<Row {'comment': <Row {'update_record': <function <lambda> at 0x927fc6c>, 'lft': 1, 'article_id': '1', 'id': 8, 'delete_record': <function <lambda> at 0x927f764>}>, 'node': <Row {'update_record': <function <lambda> at 0x927fc34>, 'rgt': 1, 'article_id': '1', 'id': 10, 'delete_record': <function <lambda> at 0x927ff7c>}>}>
so in order to use update_record you'll need to specify which row to use it from explicitly so you'll end up with some thing like the following code in order to make things work:
for row in db((db.comment.article_id==db.node.article_id)& (db.comment.lft>=db.node.rgt)).select(): row.comment.update_record(lft=row.node.rgt)
Of course you don't need this if you just select records out of one table
so you can safely do the following :-
row = db(db.person.id > 2).select().first() row.update_record(name='Curt')l
In fact you can use another trick in order to update the row which is :-
db.executesql('update comment, node set lft=lft+2 where %s;' %str(db.comment.article_id==db.node.article_id))
which mixes SQL with web2py-SQL but is safe from SQL injections.
Warning :
Using the previous query with SQLITE, I got that error :
OperationalError: near ",": syntax error
If some body knows what's wrong and how it can be fixed, please let me know.
My guess is that it can be done another way, But I'm not An SQL guru.
To summarize:
update_record is very very useful in situations like if you want to use the old value of a field in a row to make some calculations then update it.
rows=db(db.page.id==1).select() rows.first().update_record(counter = rows.first().counter + 1)
or you can make it like:
query=db.table.field == 'whatever' db.executesql('UPDATE ..... WHERE %s' % str(query))
Another cool thing that I want to talk about is the flexibility of DAL for dealing with queries.
in fact :-
db.table.fiesld == value
produces a Set object …. interesting right ?!!!! 😀
yes a Set object that can be Anded or ORed
so you can easily mix many queries together
query = db.table.company_id>5 query2 = auth.accessible_query('update', db.company, auth.user.id) query3 = auth.accessible_query('owner', db.company, auth.user.id) query4 = (query2 | query3) result = db(query&query4).select()
auth.accessible_query -> returns records with specific permissions
As you can see I get either the the records in db.company that the current logged in user has the permission 'update' or 'owner' on them , by using 2 queries that are gonna be ORed another query which in its turn is Anded with another query.
This's beautiful ….. right ?
you can even do somethings like :
# model db.define_table('node', Field('article_id'), Field('rgt', 'integer')) db.define_table('comment', Field('article_id', requires=IS_IN_DB(db, db.node.article_id)), Field('lft', 'integer'), Field('order', 'string')) # data : comment.id comment.article_id comment.lft comment.order 1 1 1 None 2 2 2 None 3 3 4 None 4 1 1 a 5 2 2 d 6 3 2 b 7 2 1 Z 8 3 1 - 9 2 2 - # controller def index(): myorder=db.comment.order.upper()|db.comment.id print db().select(db.comment.ALL,orderby=myorder) # result comment.id,comment.article_id,comment.lft,comment.order 1, 1, 1, <NULL> 2, 2, 2, <NULL> 3, 3, 4, <NULL> 8, 3, 1, 9, 2, 2, 4, 1, 1, a 6, 3, 2, b 5, 2, 2, d 7, 2, 1, Z
BTW : groupby can be dealt with in the same manner
Another neat example on using sub-queries and query sets:-
Suppose you've a list of strings representing search items that you want to search database for strings containing tem or 'LIKE them'.
The list is variable though, meaning that it can hold another search items in future what can I do then?
search_terms = ['..', '..', '..', ...] for i,st in enumerate(search_terms): subquery=db.company.name.lower().like('%'+st.lower()+'%') query=query|subquery if i else subquery companies = db(db.company.id.belongs(db(query)._select (db.company.id))).select()
see the query=query|subquery if i else subquery 😀 interesting right ?!!
for python newbies … this has the effect of choosing
query = subquery in the first iteration since i = 0
then every time query and subquery are ORed resulting in a query set that will be ORed with the next subquery. Coooool right ?!!
Some other interesting stuff
The following code is interesting but I don't know how to make use of it, ..If some body has an idea, please let me know.
s=db() s.sql_w s=s(db.users.id>1) s.sql_w 'users.id>1' s=s(db.users.id<=4) s.sql_w '(users.id>1 AND users.id<=4)'
in fact both of the following queries are equivalent:
db = DAL('sqlite:memory:') # interesting right ?!!! db.define_table('x', Field('y') db.x.insert(y=9) db.x.insert(y=10) db.commit() str(db(db.x.id>0).select()) 'x.id,x.y\r\n1,9\r\n2,10\r\n'
oh by the way making db((..) & (..)) is equivalent to db(…)(…) which is happening in the code above s= s() then s = s() => s()()
str(db().select()) gets a comma separated values of the result interesting right ?!!
it's useful by the way in the shell when you're testing where there's no tables, just objects 😀
db(db.table.field … value) is equivalent to db('table.value … value') more interesting right ?
This's very interesting in deed, in the sense that enables you to make complicated queries:
instead of making something like:
sql_string = 'SELECT * from message where distance_sphere(GeometryFromText(\'POINT(\' || longitude || \' \' || latitude || \')\', 2), GeometryFromText(\'POINT(-122.415686 37.799724)\', 2)) > 105;' records = db.executesql(sql_string) return dict(records=records)
you can do :
cond="distance_sphere(GeometryFromText(\'POINT(\' || longitude || \' \' ||latitude || \')\', 2), GeometryFromText(\'POINT (-122.41568637.799724)\', 2)) > 105" records=db(cond).select(db.message.ALL)
Oh, By the way the strings are having their quotes escaped to prevent sql injection attacks, this's required if you're going to use executesql() directly
I found this very cool what about you ?!!! 😀
Now I think it's the time to generalize this for more and deep understanding
In the web2py foder you can get an application shell using:
python web2py.py -S -M
Now you can do:
db.define_table('test', Field('x')) db.test.insert(x='hey "hamdy", how're ya') # in the shell don't forget to commit so that effects can be reflected # commits are automatic from within web2py not from within the shell, they've to be explicit db.commit() query = db(db.test.x == 'hey "hamdy", how are ya') query.sql_w # the result : 'test.x=\'hey "hamdy", how are ya\'' # quotes are escaped right ?
Now what if the query string is complicated enough and it's a bare sql query, how can I use it safely without the need for using executesql() which is not safe at most times unless you took care and escaped your strings properly ?
in my case , I want to select the field's x value from table test, so I can make my query string like:
cond = """x = 'hey "hamdy", how are ya'""" or cond = """test.x = 'hey "hamdy", how are ya'"""
Now when I want to select from database I can play it easily like:
str(db(cond).select(db.test.ALL)) # result 'test.id,test.x\r\n1,"hey ""hamdy"", how are ya"\r\n'
Note that I put the query string inside the db(), then chose the table to select from , in the select()
and it worked.
You don't have to choose [this's optional in this case] table inside the select() if you provided it in the string .
This's not gonna work though:
cond = """db.test.x = 'hey "hamdy", how are ya'""" str(db(cond).select(db.test.ALL))
since in the case of specifying a query string don't say :
'db.table.field ....'
we're not using a pure DAL syntax here
instead say:
'table.field. ....' or 'field. ...'
You may instead do:
db.test.x == 'hey "hamdy", how are ya' <gluon.sql.Query object at 0x257bcd0> str(db(cond).select()) 'test.id,test.x\r\n1,"hey ""hamdy"", how are ya"\r\n'
Confusing ? !!! 😀 it's so simple, as a role of thumb you can either do: db.table.field == value db.table.field > value or 'table.field=value' 'field=value' # string can't have == inside it but can contain any other conditional operators
According to this post which explains how to check whether cache is functioning or not, I used the same trick to explain another interesting thing that I like very much.
All of us knows that select() statements can be cached using something like:
db(...).select(..cache=(cache.ram,3600)) #3600 is the expiration time
Now imagine with me this scenario : you have a set of records that are cached in some controller action [say index of your web application]
those records represent recently added products if your web application is all about an online store.
Now suppose you've another controller function that add new products to your online store.
What's the problem here ?
It's that you need the cache to be flushed whenever inserting new record .
Can this be done ?
Sure, otherwise I wouldn't have talking about it.
You just need something to refresh the cache.Something to enforce reading database and re-caching results again
#model: db.define_table('product', Field('x')) #controller def index(): rows = db().select(db.product.ALL, cache=(cache.ram, 600000)) if db._lastsql: print 'First time or not cached' else: print 'cached' return dict(rows=rows) def insert(): db.product.insert(x='3') rows = db().select(db.product.ALL, cache=(cache.ram, -1)) return dict(rows=rows)
Now before doing any thing just add records to database using appadmin interface.
product.id product.x 1 1 2 1 3 3
Now go to the application's index page
You'll have the statement "First time or not cached" printed indicating first time querying database.
And you'll get the table:
product.id product.x 1 1 2 1 3 3
By keeping refreshing the page you only get the same results and the statement "cached" is printed every time.
So records are cached for a long period of time
Now go to the insert page that inserts another record
the result will be:
product.id product.x 1 1 2 1 3 3 4 3 # newly inserted
by going to index one last time you'll see the updated table and you'll have the statement "cached" being printed even when refreshing the page.
rows = db().select(db.product, cache=(cache.ram, -1))
checks if the same select() statement was issued before and having some cached records , then it will just refresh the cache [re-read database] then records will continue to be cached for a time equal to the original time used for caching them (600000) in our case.
If not, they'll be re-read .
Now close web2py then re-run it [to flush all caches and starting over]
try this code:
def insert(): db.product.insert(x='3') rows = db().select(db.product.ALL, cache=(cache.ram, -1)) if db._lastsql: print 'First time or not cached' else: print 'cached' return dict(rows=rows)
Now only go to the insert page and keep refreshing page.
what you see ?
Correct , the statement "First time or not cached" keeps printed
so there's no real cache. database is re-read and if records were previously cached , cache is renewed.
both 0, and -1 are correct (cache.ram, 0) or (cache.ram, -1) but -1 is always the safe choice.
Another thing that is trivial to mention but it's here anyway for any newbie guy that may not know it:
any insert() statement like this one:
returns back the id of the newly inserted record so that you may use it
Also any update like :
d(...).update(field_name=vlue, field2_name=value2,...)
statement returns back 0 if there's no records updated [condition is not True for all the records in the table] and if condition is True the number returned is the number of records that are updated.
Why would this be helpful ?
Because sometimes you get situations in which for example you like to update some user records then if update is successful, you'l have to send notification mails for those users.
delete() has the same behavior as update
In both update() & delete(), this can be done using the following line of code in gluon/sql.py:
try: counter = self._db._cursor.rowcount except: counter = None
Imagine the following situation…. You've deleted a record in some table which id is referred to by another table and let's say the referenced field is not a foreign key and in defining the table that includes that record no 'ondelete=CASCADE' was specified and thus when deleting the record , all other record tables referring to it will not be deleted automatically.
Let's imagine that id of the deleted record was 1000 , and then imagine that you entered a new record in that table ..what id it should take?
if it took 1000 then you're in a mess right ? many records that has no relation with it will just refer to it right ?
To prevent this …. any new record that will be inserted into database will take a new id that was not taken before so our luckily, the new id will take the id 1001 even if you've deleted all table records and it includes nothing …
If you want to reset table to original state , delete all records and reset counters use:
and congratulations !!! you got a brand new table
Can I make a dummy database for just testing the validation of a form and database query generations?
Yes sure !!!
# Model db = DAL(None) db.define_table('members', Field('name', requires=IS_NOT_EMPTY())) #Controller def index(): form = SQLFORM(db.members) if form.accepts(request.vars, session): response.flash = T('hey it worked') rows=db().select(db.members.ALL) print db._lastsql return dict(form=form)
Congratulations !!! without need to introduce extra/new syntax.
Internally DAL(None) behaves like a sqlite db and you can use it test query generations as well but there is nosqlite file so nothing is stored and no overhead.
Self referencing tables …!!
DAL should allow self referencing tables. This is not a DAL issue, this is an SQL issue. There is in fact a logical problem in inserting the first record.
Actually web2py allows you to create self referencing tables.
Don't make an automatic reference, just use instead of a field of type reference a one of the type 'integer' then you can, optionally, use the IS_IN_DB validator.
For a parent record you may use 0, or -1 but [-1 is always the safer choice]
db.define_table('class', Field('name'), Field('parent_class', 'integer'))
then inserting records in parent_class based manually, and insert (-1) if parent_class is 'Object' 😀
A better trick to do this would be:
db.define_table('class', Field('name'), Field('parent_class', 'integer')) db.class.parent_class.type='reference class' Also set db.class.parent_class.requires=IS_NULL_OR(IS_IN_DB (db,'class.id','%(name)s'))
Now see the IS_NULL_OR(IS_IN_DB()) …. interesting right ? !!!!!! 😀
Now you can insert object and just don't insert a parent for it.
Is there any other straight and plain way to get the result? Actually, I have a table with many columns, what I want is select a row which has a max id. As my understood, the db.table.id.max() should return
directly the max value in column 'id'. and then I can use 'db(db.table.id==maxid).select()' to select the row I want.
A hint:
Please, take care of not using a reserved SQL keywords as a table names or field names, RDBMSes vary and there're lots of reserved keywords , some of them specific to some RDBMSes
so take care.
Abstract tables
db=DAL() db.define_table('a',Field('name')) db.define_table('b',Field('other')) db.define_table('c',Field('test'),db.a,db.b) print db.c.fields ['id','test','name','other'] db=DAL() from gluon.sql import SQLTable abstract=SQLTable(None,Field('name')) db.define_table('mytable',abstract,Field('other')) print db.mytable.fields ['id','name','other']
Abstract table is a table that is defined but does not exist in the DB. It can be used to define derived classes that include the same fields. For example:
db=DAL() from gluon.sql import SQLTable person=SQLTable(None,Field('name'),Field('address')) db.define_table('student',person,Field('degree')) db.define_table('teacher',person,Field('subject'))
Here table person is not in the DB, but student and teacher are. The
latter have the fields defined in person plus others.
Do not abuse this. Often this is better to do:
db=DAL() db.define_table('person',Field('name'),Field('address')) db.define_table('student',Field('person',db.person),Field('degree')) db.define_table('teacher',Field('person',db.person),Field('subject')) # Field('person', db.person) is the same as # Field('person', 'references person')
if a student references a person but it does not have the fields of a
Some sweet and light tricks :
To check the SQL syntax of different dbms :-
python web2py.py -S welcome db=DAL(None) db.define_table('person',Field('name')) for n in ['sqlite','postgresql','mysql','oracle','mssql','firbird']: db['_dbname']=n print db()._select(db.person.name,limitby=(0,10))
SELECT person.name FROM person LIMIT 10 OFFSET 0; SELECT person.name FROM person LIMIT 10 OFFSET 0; SELECT person.name FROM person LIMIT 10 OFFSET 0; SELECT person.name FROM (SELECT _tmp.*, ROWNUM _row FROM (SELECT person.name FROM person ORDER BY person.id) _tmp WHERE ROWNUM<10 ) WHERE _row>=0; SELECT TOP 10 person.name FROM person ORDER BY person.id; SELECT person.name FROM person LIMIT 10 OFFSET 0;
d2=SQLDB('sqlite://d2.db') d2.define_table('person',SQLField('name')) d2.person._referenced_by [] d2.define_table('dog',SQLField('name'),SQLField('owner',d2.person)) d2.person._referenced_by [('dog', 'owner')] d2.dog.drop() d2.person._referenced_by []
How Do I use IIS with web2py?


text:
CHICAGO - Chicago Blackhawks sweaters are commonplace around the city these days - though not all wearers realize that's what hockey players and die-hard fans call those "jerseys."
As the Blackhawks have a 1-0 lead in the best-of-seven Stanley Cup finals with the Boston Bruins, Chicago is awash in red and black hats, T-shirts and jerseys - er, sweaters. But because hockey is a mystery to many - a game played largely by bearded men with hard-to-pronounce names - this particular season's bandwagon is loaded with fans who don't know the difference between the blue lines on the ice and the Blue Line train that runs out to O'Hare.
"A lot of these people, all they know is that somebody in Chicago is going for a championship," said Jordan Goldberg, manager of the Third Rail, a tavern a few blocks from the United Center, where the Blackhawks play.
The throngs filling the bars during the games include a fair number of people who are caught up in the party atmosphere but barely watching the game.
"When a goal is scored, they yell like everyone else, but then they go back to what they were doing," said Curtis Tinnell, a computer analyst who donned a well-loved Blackhawks T-shirt and cap as he walked through downtown.
Those fans probably also don't know it's superstition that keeps hockey players from shaving during the playoffs. But the 29-year-old bearded Tinnell does: The last time he grew one was during the 2010 playoffs, which ended with the Blackhawks winning the Stanley Cup.
That's not to say Chicago doesn't have its share of rabid fans, with intimate knowledge of the team's Original Six history, the game's rules and the fact those two blue lines are used to determine if a player is offside. But the half-century Stanley Cup drought that preceded the 2010 championship, the fact the team didn't televise home games until a few years ago and recent NHL lockouts certainly have contributed to a waning collective interest.
So Bob McDermott, owner of The Beer Bistro in Chicago's West Loop, now finds himself fielding questions about everything from why the jerseys are called sweaters (because, he said, it's cold on the ice) to why the players suddenly stop playing for no apparent reason.
"They ask if it is a time out, and I say, �It's not really a time out but part of the game, kind of like a foul ball,'?" McDermott said.
Out on the street, it's tough to tell who the real fans are. Stores and souvenir stands sell slightly tattered hats and pre-faded shirts.
But it's also difficult to get people to admit they're getting swept up in the frenzy over a game they don't quite understand.
"I don't think anyone wants to own up to it," said Jessica Hegarthy, a 42-year-old attorney who was buying a T-shirt for her 6-year-old son. Hegarthy herself grew a bit sheepish when she said that while her husband and son were watching the triple-overtime Game 1 on Wednesday night, "I was upstairs watching �Real Housewives.'?"
But the bandwagon fans do give it away sometimes.
"One of my employees came up to me and said how excited she was and then she said, �If they lose tonight they're done, right?'?" said Monique Mendoza, a 21-year-old theater manager, who said she passed on the opportunity to explain it wasn't a one-and-done series. "I was like, �Get out of here.'?"
In Boston, bar manager Jason DeSantis insists most fans who come out understand what they're watching.
"We have people who don't show their colors until the playoffs (but) they know the sport, they know the teams, they know the players," said DeSantis of the Cask n' Flagon, across the street from Fenway Park. "Without a doubt, this is still a hockey town."
And Chicagoans seem to be catching on. Jason Braz, who mans a souvenir stand about a mile from the United Center, said there are far more informed Blackhawks fans now than in 2010. Back then, when fans wanted merchandise with the name of Blackhawks captain Jonathan Toews, (pronounced TAVES), they instead would say "toes."
But now, "the number who say �toes' and not �taves' is much smaller," he said. "The fan base is definitely growing."

subset: commoncrawl


text:
Could Collection Societies Help Up-And-Coming Artists With A 20/80 Distribution System?
from the one-idea deptIt's no secret that I'm not a fan of music collection societies in general. I tend to think that once they get the right to collect they begin to abuse that power in ways that actually harm musicians and songwriters more than help them. That's because once they're given a right to demand payments, they continually look to expand that right: covering more areas and increasing the amount they can demand.
While, at first, that might seem like a good thing for the musicians and songwriters they represent, what many don't take into account is the wider repercussions and unintended consequences. For example, by making music more expensive to play, they actually take away a lot of the incentive for many places to play music -- thereby cutting down on promotional venues for certain artists. This has hit coffee shops and other small venues especially hard, and that's quite a problem since so many musicians actually get their start performing at various open mic nights. The second problem, of course, is in distribution. How do these collection societies accurately distribute money. By their very nature, they really can't track how often songs from less-well-known artists and songwriters are played, and so they often just focus on bigger acts -- effectively taking money that should go to smaller artists and giving it to bigger artists! If you catch representatives from those groups off-guard, they even seem willing to admit that, such as the time that a BMI exec responded to such criticism from a songwriter who wasn't getting paid: "I would like to tell him is that he needs to write a hit song."
Andrew Dubber has been thinking about this issue, and is wondering if there might be a slightly better solution that would help up-and-coming artists. His idea is that these collection societies should take 20% of their overall pot of money, and divide it equally among the lower 80% of the musicians and songwriters who are members. It wouldn't be that much money, but it would give them all some money. The remaining 80% of the collection revenues would still be handed out as usual, using whatever techniques the collection societies use to figure out who gets what. My first reaction on hearing this is that it would get people to sign up for a chance at "free money," making it something like a welfare system for musicians. But, Dubber points out in the comments that in order to qualify, you'll still need to have a song that was used somewhere else. You can't just say you're a musician.
I'm still not totally convinced that this would work, and I'm also not convinced that the collection society setup is even worth saving at all. But if such societies are going to be around (and it's almost certain they're not going anywhere), then we might as well look at ways to make them actually help more musicians, rather than simply propping up the top of the top, while holding back new comers.
Filed Under: collection society, distribution, fairness, music


text:
Running time: 2 hours 25 minutes (including interval)
Led by three of the finest musical theatre stars and saying 'Hello, Buenos Aires' for the first time is Lucy O'Byrne (The Sound of Music, Les Misérables) in the iconic role of Eva Perón, with Mike Sterling (The Phantom of the Opera, Les Misérables) as Juan Perón and, award winning West End leading man, Glenn Carter (Tim Rice and Andrew Lloyd Webber's Jesus Christ Superstar – on stage and screen, Les Misérables) as Ché.
Please note: Concessions have limited availabilty
Running time: 2 hours 25 minutes (including interval)Read Less
Led by three of the finest musical theatre stars and saying 'Hello, Buenos Aires' for the first time is Lucy O'Byrne (The Sound of Music, Les Misérables) in the iconic role of Eva Perón, with Mike Sterling (The Phantom of the Opera, Les Misérables) as Juan Perón and, award winning West End leading man, Glenn Carter (Tim Rice and Andrew Lloyd Webber's Jesus Christ Superstar – on stage and screen, Les Misérables) as Ché.
Please note: Concessions have limited availabilty
There are no booking fees for this production.
However, all bookings made through ATG Tickets for this venue are subject to a £2.85 Transaction fee.
Evita Access
Access Booking line: 0800 912 6971
Liverpool Empire Visual Story: a visual resource to help prepare visitors for a new experience and to help them become familiar with new surroundings and what to expect.
Liverpool Empire Audio Story: an audio resource to help prepare visitors who are blind and visually impaired for their visit to the theatre.
For a copy of the venue's visual or audio story, please contact the Liverpool Empire Access Champion on 0800 912 6971.
28/03/2019 - 19.30 – Kinky Boots - Signed
01/04/2019 - 19.30 – Kinky Boots - Captioned
03/04/2019 - 19.30 - Kinky Boots - Audio Described
08/05/2019 - 19.30 - Dirty Dancing - Signed
11/09/2019 - 14.30 - Blood Brothers - Captioned
11/09/2018 - 19.30 - Blood Brothers - Signed & Audio Described
14/10/2019 - 19.30 - Les Misérables - Audio Described & Captioned
17/10/2019 - 19.30 - Les Misérables - Signed
20/12/2019 - 14.00 - Peter Pan - RelaxedAccess Performances
- Audio Description None scheduled
- Sign Language Interpreted None scheduled
- SUR Titles None scheduled
- Relaxed Performances None scheduled
There are sixteen wheelchair spaces available in the auditorium. 12 in the stalls and 4 in the circle. There is lift access to all levels of the theatre except the Rear Circle where access is obtained by lift and steps. All areas of the Theatres are accessible to customers with limited mobility, including wheelchair users. There is level access from Lime Street, through into the foyer, with level access into the auditorium at both sides of the stalls. The building features wide doors, and additional toilet facilities for disabled people. One front of house lift provides access to the circle and one lift provides access to the stalls bar toilets, with appropriate seating positions available on all levels.
Liverpool Empire Theatre is equipped with an infrared sound amplification system. To access the infrared system please request receiving equipment from a member of the Front of House team who will provide you with an induction loop necklace.
Induction Loop Necklace
Suitable for persons wearing a hearing aid, the induction loop necklace is worn around the neck. Whilst wearing the necklace, switch your hearing aid to the 'T' setting and the sound is amplified. The necklace has an adjustable volume control.
There are a number of British Sign Language Interpreted performances, Audio Described performances and Captioned performances every season. For advice and to book these performances please call 0800 912 6971.
Guide, hearing and other working dogs are welcome in all parts of the theatre.
There are public toilets on all levels of the theatre. There are separate accessible toilets on the ground floor and second floor of theatre. There is an emergency pull cord in all accessible toilets should you need assistance from a member of staff.
Baby changing facilities are located in the accessible toilet on the second floor and ladies toilets on the lower ground floor stalls bar.
Liverpool Empire Theatre Information
Lime Street
Book in person by calling into our Box Office on the corner of London Road and Lime Street. Our Box Office Opening Times are displayed on the right of this page.
By Car:
The Liverpool Empire Theatre is located on Lime Street and is easily accessible by road. For SATNAV use L1 1JE.
The theatre does not have its own parking facilities but Liverpool boasts many city centre car parks with reasonable rates and many are within 5 minutes' walk of the theatre. The closest car parks are located at Lord Nelson Street, Queen Square and at St John's Shopping Centre on Lime Street.
By Train:
The Liverpool Empire Theatre is next door to Lime Street Station. Local (Wirral Line) and National rail services stop at this station. Please use the Lord Nelson Street exit for the theatre.
By Bus:
Key services stop on Lime Street including the 101, C2, C3 , C5, 10, 10A and 10B
Calls cost 7p per minute, plus your phone company's access charge.Groups Bookings : 0333 009 5384 (9am – 5.30pm)
Calls charged at local rate.Access Bookings : 0800 912 6971
Stage Door / Admin:* : 0151 702 7320
ATG continues to make the safety and security of its customers and staff a priority. As such, please bear in mind that we may undertake bag checks, so recommend you leave extra time to avoid queues, and refrain from bringing suitcases rucksacks and large bags into the Theatre. Many thanks for your cooperation."
Don't forget to pre-order your interval drinks when you arrive as all bars get busy! During most performances alcoholic drinks are allowed into the auditorium. We now accept all major credit and debit cards for bar bill payments.
To pick your own seats for Evita at Liverpool Empire Theatre simply find the performances you'd like to see from the listings below and you'll be given the option.
ATG TheatreCard
Want to get closer to everything you love about the theatre? Introducing TheatreCard Classic and TheatreCard Plus: our members' clubs.
With prices starting from just £35 a year, why not become a TheatreCard member today?JOIN THEATRE CARD MORE INFO
- Priority booking
- Priority seat selection
- No booking fees on most shows
- No transaction fees on all shows
- No-quibble ticket exchange
- Exclusive savings
- Cloakroom pass
- Dedicated booking line
- Beautiful brochures
- Regular newsletters
- All of classic plus...
- Free ticket protection
- Invite only facebook group access
- News before anyone else
Evita Group Bookings
Enquire here
Email: [email protected]
Groups Booking line: 0333 009 5384 (9am – 5.30pm) Calls charged at local rate.
- Reserve now, pay later
- No booking fees on selected shows
- Huge savings on the majority of shows
- Easily amendable reservations
- Reserve more than one show at once
- No deposits required
- Reservations are invoiced, and are easy for you to review and check before paying
- Tickets posted free to your door
- Pre-book hospitality packages
Find out more about Group Bookings


text:
Interpretive media is our passion—place-based, purpose-built. We work with our colleagues throughout the National Park System to develop and produce digital media, films, historic furnishings, interpretive plans, maps, museum exhibits, publications, signs, and wayside exhibits.
We also provide expertise in accessibility, contracting, cost estimating, graphics research, museum conservation, project management, reprinting, rehabbing, and replacing existing media.


text:
This blog post is now in press in the American Journal of Epidemiology
Based on the data of pregnant Dutch women participating in a longitudinal study Truijens and colleagues (1) have drawn the provocative conclusion that the MH17 crash has increased depressive symptoms among pregnant women in The Netherlands (Dutch newspaper article on it here). They compare the answers on the Edinburgh Depression Scale (EDS) of 126 women in the month after the MH17 crash with the EDS scores from 106 pregnant women collected during the summer of 2013, and observe a small effect, t(230) = 2.12, P = 0.03, d = 0.3.
Based on the data of pregnant Dutch women participating in a longitudinal study Truijens and colleagues (1) have drawn the provocative conclusion that the MH17 crash has increased depressive symptoms among pregnant women in The Netherlands (Dutch newspaper article on it here). They compare the answers on the Edinburgh Depression Scale (EDS) of 126 women in the month after the MH17 crash with the EDS scores from 106 pregnant women collected during the summer of 2013, and observe a small effect, t(230) = 2.12, P = 0.03, d = 0.3.
The women participated in the HAPPY study (2), which started in January 2013, in which the EDS is administered at 12, 22, and 32 weeks of gestation, as well as one and six weeks after giving birth. This means the researchers have access to the EDS scores from more women at different stages during or after their pregnancy. Instead of 'defining' two groups at 32 weeks of gestation, the authors could have chosen to compare the data from all women in the HAPPY study to examine whether there was an increase in depressive symptoms. If the MH17 crash impacted pregnant women, similar patterns should be observed for the other women whose data was available. The authors do not explain why they report a subset of their data, even though selective reporting requires a strong justification.
The evidence itself is weak. High p-values (e.g., above 0.02) are rather unlikely when there is a true effect (3), and Bayesian statistics (4) with a Cauchy prior and r scale of 0.707 yield a JZS Bayes Factor of 1.96, indicating the observed difference is only 1.96 times more likely under the alternative hypothesis than under the null hypothesis, which is considered anecdotal evidence.
If the MH17 crash increased depressive symptoms, we might expect women would be more depressed at 32 weeks of gestation (after the MH17 crash) than at 22 weeks of gestation (before the MH17 crash). A dependent samples t-test comparing the mean at 22 weeks (mean = 5.09) against the mean at 32 weeks (mean = 5.21) for women measured in 2014 is the most direct test of the hypothesis. Even when measurements are highly correlated, this difference is not statistically significant. In other words, there is no significant increase in depressive symptoms after the MH17 crash in 32 week pregnant Dutch women compared to how depressed the same women were 10 weeks earlier, before the crash had happened.
Not only the presence of a control condition, but also the choice of the specific control condition, is open for debate. Had the 2014 data been compared to a larger Dutch validation study (5), EDS scores in week 22 and 32 would have differed significantly between years. Comparisons between subjects over time do not allow for strong conclusions. Other factors, such as the weather, differed between 2013 and 2014. The authors note both summers had a 'comparable number of hours of sunshine'. However, the summer of 2013 was warm and dry (with an official heatwave at the end of July), while the summer of 2014 was cold and wet (with August being the coldest month in 20 years). Having explicitly looked at influences of the weather, the authors could have provided a more accurate overview of the differences between these two summers.
Although I understand the researchers were tempted to look at their data after the MH17 disaster occurred, the observed difference might be spurious or caused by a confound. Replication of the observed pattern in the remaining data the authors have access to would take away concerns about the reliability (although not the validity) of the observed difference.
1) Truijens SEM, Boerekamp, CAM, Spek, V, Son, MJM, Oei, SG, & Pop, VJM. Increased levels of depressive symptoms among pregnant women in The Netherlands after the crash of flight MH17. American Journal of Epidemiology. (doi: 10.1093/aje/kwv161)
2) Truijens, SE, Meems, M, Kuppens, SM, Broeren, MA, Nabbe, KC, Wijnen, HA, & Pop, VJ. The HAPPY study (Holistic Approach to Pregnancy and the first Postpartum Year): Design of a large prospective cohort study. BMC pregnancy and childbirth. 2014:14:312.
3) Lakens, D, & Evers, ERK. Sailing from the seas of chaos into the corridor of stability practical recommendations to increase the informational value of studies. Perspectives on Psychological Science. 2014;9:278-292.
4) Rouder, JN, Speckman, PL, Sun, D, Morey, RD, & Iverson, G. Bayesian t tests for accepting and rejecting the null hypothesis. Psychonomic Bulletin & Review. 2009;16:225-237.
5) Bergink, V, Kooistra, L, Lambregtse-van den Berg, MP, Wijnen, H, Bunevicius, R, van Baar, A, & Pop, VJM. Validation of the Edinburgh Depression Scale during pregnancy. Journal of Psychosomatic Research. 2011;70:385-389.


text:
MOVIE REVIEW- Reunion flop: 'X' makes the z-list
If you've ever been disappointed seeing one of your favorite bands in a "once more for the money" reunion tour, you have an idea of what to expect from The X-Files: I Want to Believe. Twenty-first century Fox Mulder (David Duchovny) and Dana Scully (Gillian Anderson) are shadows of their former selves but no longer working in shadowy places.A female agent has disappeared, and a priest, Father Joseph Crissman (Billy Connolly), has come forward claiming psychic knowledge of the case gained through "visions." He leads the FBI to a severed limb buried in the snow. (Set in West Virginia but filmed in British Columbia, the movie looks cold enough to save a fortune on air conditioning.)
Once Mulder and Scully arrive on the scene, they learn Father Joe is a "convicted pedophile" who "buggered 37 altar boys" and now lives in a dorm with other sex offenders. "Just avoid the activities room," Mulder cracks in one of his few funny lines. Scully is so sickened by the priest that she begs Mulder to drop the case she got him into, but he's hooked.
Another young woman disappears, and more body parts turn up. It soon becomes apparent– but if you're worried about spoilers, jump to the next paragraph– that the story is about trafficking in human organs. That the men behind it were wed in Massachusetts won't do much to promote gay marriage, but the movie displays enough ambivalence about stem cell research to avoid offending partisans on either side of that issue.
The current incarnation of the FBI is represented by Alvin "Xzibit" Joiner as Agent Mosley Drummy, who doesn't get along with anyone, and Amanda Peet as Special Agent in Charge Dakota Whitney, who doesn't act like she's in charge of anything and whose primary function seems to be making Scully jealous by talking to Mulder.
Callum Keith Rennie is one of the villains, Eastern Europeans all. That their dialogue isn't subtitled is a blessing, assuming it's on the same level of arcanery and banality as that of the English-speakers.
Despite a number of cliffhangers and action scenes, there's surprisingly little excitement in I Want to Believe. References to the old days are tossed in for the loyal fans as Scully and Mulder link each other's current obsessions to the past, and a familiar face turns in an 11th-hour cameo.
The X-Files: I Want to Believe was screened for critics very close to opening. It could have been, as the studio said, to preserve the secrecy of the plot, but historical precedent overwhelmingly favors the theory that they didn't want word getting out about how bad it is. The movie itself bears that out.
If the first X-Files movie got you addicted to the TV series, the second one will serve as your 12-Step program. It can turn you from an "X" fan to an ex-fan in 104 minutes or less. There are no aliens involved in the plot, but you may be wishing for some to show up in the theater, abduct you, and transport you to another movie.
Yes, the reunion is a bust. Duchovny, Anderson and writer-director-creator Chris Carter no longer make beautiful music together.
Scully, fighting a hospital administrator who wants to send her patient to a hospice, is moved when Father Joe tells her, "Don't give up."
Memo to Chris Carter: Give up.
2 comments
I wholeheartedly agree with this. I went to this movie feeling optimistic that I would see something that reminded of the show I once loved. Instead, I get X-Files Lite.
I read elsewhere that's being referred as CSI: Vancouver and that it is the perfect name for it.
Instead of scary standalone, we get half-hearted crime melodrama with a few paranormal elements.
If there is another film, (which I seriously doubt)
they need to write one that appeals to all segments of the fanbase instead of it being for only the Mulder and Scully romance fans. I also think they should re-watch some of the true classics as a refresher course. Maybe then, they won't make a film that looks like it came from an unused TV script.


text:
Biochemistry and Molecular Biology
Students in the biochemistry and molecular biology program at Agnes Scott have the opportunity to develop the knowledge and skills central to these scientific disciplines. Structure and functional relationships of biological molecules and systems, chemical and biological reactions and their significance in biological systems, and modern methods for acquiring, analyzing and retrieving data are the primary focuses for the biochemistry and molecular biology student.
What will I study?
A wide variety of courses across scientific disciplines are required for this major. Students will take courses in biology, chemistry, mathematics and physics. In addition, all students must participate in a supervised research experience. The research experience enables students to apply their knowledge of biochemistry and molecular biology through hands-on application, gaining practical experience in the process of science.
Why should I study biochemistry and molecular biology at Agnes Scott?
- The City of Atlanta
Atlanta provides biochemistry and molecular biology majors tremendous resources for experiential learning opportunities, including internships and practicum experience at the following locations:
- The Centers for Disease Control and Prevention
- Emory University School of Medicine
- Georgia Institute of Technology/Emory Biomedical Engineering Program
- Campus Involvement
Many biochemistry and molecular biology majors are members of biology honor society Beta Beta Beta and the award-winning student-affiliate chapter of the American Chemical Society, as well as members of more than 70 other student-run organizations and clubs on campus, providing plentiful opportunities to lead, shape and enjoy campus life. Majors have held many student leadership positions, including president of Student Government Association and president of Student Senate, among others.
- Faculty Research on Campus
Faculty in the biology and chemistry departments are actively engaged in research. Opportunities for student/faculty research collaborations are available both during the academic year and the summer.
What can I do with this degree?
As a biochemistry and molecular biology major, you will gain a thorough grounding in biological and chemical principles and receive a well-rounded educational foundation for a variety of career goals. As a graduate, you can:
- Pursue advanced study in biochemistry, molecular biochemistry, pharmacology, medicine, dentistry or veterinary medicine
- Work in technical and non-technical areas of biochemical, medical and pharmaceutical industries
- Engage in scientific writing or editing


text:
- Font:
- +
- -
Smoked lizard dipped in barbecue sauce. Deep-fried crickets. Fudge-covered scorpion. Nope, these aren't the latest exotic street food offerings from half a world away. These multilegged dishes are prepared by a vendor known as Chef John at the Arizona State Fair, held every fall in Phoenix.
State fairs, of course, are synonymous with fried foods. And while the usual staples like funnel cakes remain, cooking up unusual options has become a sport in itself. At fairs across the U.S., concessionaires delight in one-upping each other with the strangest, fattiest, most questionably edible snacks, many of which fall into one of two genres: "deep-fried" or "on a stick." (Some are both, like deep-fried M&Ms on a stick.)
Click for slideshow: Strangest state fair food
"I want to be surprised and amazed," says Sue Stoecklein, commercial exhibits director for the Kansas State Fair, who's looking forward to this year's Krispy Kreme burger, which sandwiches an all-beef patty, bacon, lettuce, tomato, and mayo in between two glazed doughnuts.
Food booths at fairs emerged around 1900, mostly just selling local meats and baked goods. But the introduction of such treats as waffle cones, cotton candy, hot dogs, and Dr. Pepper at the 1904 World's Fair in St. Louis ushered in an unending era of novelty foods. In 1942, Texas debuted the foodsicle concept with the corn dog. And in the early '80s, concessionaires set out to prove that nearly everything — pickle juice included — could be served on a stick.
Today, the market for sticks and deep fryers remains strong. In Dallas, frying the unfryable has become a personal challenge for Texas State Fair concessionaire Abel Gonzales Jr., who's made his home state proud with creations like fried butter and fried Coke. The Minnesota State Fair in St. Paul, meanwhile, offers more than 70 foods on a stick, including Scotch eggs — hard-boiled and wrapped in sausage meat and bread crumbs, then deep-fried — and Key lime pie. Most concessionaires will go to great lengths to get it right: Stoecklein points to her fried green tomato guy who drove overnight to Missouri for better produce.
While admirable attempts have been made to implement some healthier options — this year the Iowa State Fair in Des Moines will feature salad on a stick — dieting isn't encouraged, and many salad and health-wrap stands aren't invited back for a second year.
So check out these odd foods when you visit your next state fair. And if you end up in Phoenix, wondering how to eat that deep-fried scorpion, stick to Chef John's advice: start with the head.
Copyright © 2012 American Express Publishing Corporation


text:
Man's shot at mouse wounds roommate
SALT LAKE CITY - A Utah man has been charged after police say he tried to shoot a mouse in his pantry and ended up wounding his roommate.
Christian Sunil Paul of Taylorsville was charged Monday in Salt Lake City's 3rd District Court with one felony count of discharging a firearm with injury and one misdemeanor count of possessing drug paraphernalia.
Calls to a number listed for Paul were not immediately returned Tuesday.
The 27-year-old told police he was aiming at the rodent during the Dec. 20 shooting, but the bullet went through the pantry and into the bathroom, where it hit Paul's roommate in the shoulder.
The roommate was taken to the hospital for treatment.
Court documents show authorities also found small, empty balloons and burnt tin foil in a bathroom trash can.


text: New Delhi, INDIA: SBI Card, one of India's largest credit card issuers, and Etihad Guest, the loyalty programme of Etihad Airways, today launched a unique travel specific Visa credit card for members and savvy Indian travellers. The card, which will be available in two variants, Etihad Guest SBI Card and Etihad Guest SBI Premier Card, will offer more rewarding experiences and bring an unmatched value proposition to Etihad Guest members and international travellers from India. First international co-brand partnership of SBI Card offering exclusive benefits up to six Etihad Guest Miles per INR 100 and Etihad Guest Tier Status upon first card swipe Extensive global reach through Etihad Airways' network to over 100 destinations worldwide; provides benefits on 100+ Etihad Guest partners including leading hotels and partner airlines Launched against backdrop of rising international travel by Indians; spends in Middle East by SBI Card customers have risen by CAGR of 66% from FY14 to FY 18, indicating the popularity of the destination among Indian travellers The card has been launched against the backdrop of increasing international travel in the country; the Indian traveller is looking for unique experiences with an increasing demand for premium brands and products in India, and the world over. Aviation passenger traffic in India has grown 12.7% annually for the past five years and IATA forecasts project India to become the third largest aviation market by FY25. Travel is a key spend category for Indian consumers, with 33% of overall card spends in the SBI Card portfolio made within the travel industry. India is a key strategic market for Etihad Airways, currently offering 147 weekly flights across 10 gateway cities in the country. The airline provides Indian travellers greater choice, more convenience and increased connectivity via its home, Abu Dhabi. IATA's 2018 India Aviation report shows about 41% of India's direct international connectivity is to the Middle East, with much of it directly to the UAE. Etihad Guest SBI Card and Etihad Guest SBI Premier Card offer complimentary Etihad Guest Silver Tier Status along with 2,500 Etihad Guest Miles, and Gold Tier Status with 5,000 Etihad Guest Miles respectively, upon first card swipe so cardholders can start collecting rewards straight away. The new co-brand cards offer an accelerated rewards programme which allows guests to earn up to six Etihad Guest Miles per INR 100 spent on Etihad.com. Cardholders also earn up to four Etihad Guest Miles on every INR 100 of international spends and up to two Etihad Guest Miles on every INR 100 of domestic spends. In addition, guests earn two Tier Miles per INR 100 spent on all transactions. Etihad Guest Miles can be redeemed to travel to destinations worldwide with Etihad Airways and over 20 partner airlines. Members can also choose to use their Etihad Guest Miles to stay at over 300,000 hotels worldwide rent the best of car hire brands with Travel Rewards or purchase thousands of products at the Etihad Guest Reward Shop. Additional benefits include additional excess baggage allowance of 10kgs and 15kgs respectively and priority boarding, 3-10% discount on direct Etihad Airways bookings as well as the new Guest +1 voucher, allowing cardholders to take a companion along with them on a reward flight in any cabin or destination. Etihad Airways Vice President Commercial Partnerships, Yasser Al Yousuf, said: "India is a key strategic market for Etihad Airways and we are delighted to launch our first India-specific credit card for our members with one of the country's most revered institutions, SBI Card. This card enables members to earn Etihad Guest Miles every time they spend, empowering them to make choices about how they collect and spend their miles. With increased travel from our guests to USA, we believe this card also strengthens our existing travel benefits including US pre-clearance." Mr. Hardayal Prasad, MD & CEO, SBI Card, said: "At SBI Card, it is our constant endeavour to build associations and create products that bring enhanced value to consumers. With Etihad Guest, we are pleased to initiate our first international co-brand partnership. Through this tie up with Etihad Guest, we seek to offer a powerful product which will complement the lifestyles of affluent and urban Indians who frequently travel overseas. Etihad Guest SBI Card and Etihad Guest SBI Premier Card will bring Indians travelling to and via the Middle East an exceptional travel experience along with maximum value in its segment. At SBI Card, we have observed that travel constitutes an important consumption category for our cardholders and with increasing disposable incomes and greater global exposure we expect this segment to continue growing rapidly. The Middle East commands an important share of the Indian outbound travel market and UAE has emerged as one of the top two international destinations for Indian travellers. We have observed a CAGR of 66% in spends on our cards between FY14 and FY18 in the region. As one of the top two international airlines for outbound international passenger traffic from India, with a strong share in Middle East, Etihad Guest is the right partner." TR Ramachandran, Visa's Group Country Manager for India & South Asia, said: "We are delighted to be partnering SBI Card and Etihad Airways in launching this unique card for the affluent Indian traveller. As the Visa Global Travel Intention study indicates, Indians are traveling more frequently than their APAC and global counterparts. often combining business with leisure. They are also open to exploring destinations further afield, including Europe & Americas and often end up visiting multiple countries on a single trip. With cash being the least preferred option for Indians on the move, we anticipate this new card to appeal to the global Indian traveller." These cards offer the maximum value compared to others in their segment. On an annual spend of INR10 lakh, the Etihad Guest SBI Premier Card offers a value back of upto INR 234,000, which is the highest of any travel cobrand card in India. Highlights of Etihad Guest SBI Card and Etihad Guest SBI Premier Card Six Etihad Guest Miles for every INR 100 spent at Etihad.com on Etihad Guest SBI Premier Card and three miles on Etihad Guest SBI Card respectively Four and two Etihad Guest Miles per INR 100 of international spends on premier and base variant respectively; Two and one Etihad Guest Miles on every INR 100 of regular spends on premier and base variant respectively Complimentary Etihad Guest Silver Tier Status on Etihad Guest SBI Card and Gold Tier Status on Etihad Guest SBI Premier Card upon first use of the card giving access to: Silver Tier Status bonus of 25% miles on and Gold Tier Status bonus of 50% miles earned flying. Instant upgrade with miles at 25% discount with Silver Tier Status and 50% discount with Gold Tier Status Priority check-in and boarding; excess baggage allowance of up to 10 Kg for Silver Tier Status and of up to 15 Kg for Gold Tier Status Complimentary Etihad airport lounge access Redemption of miles at with Etihad and over 20 airline partners as well as with over 300,000 hotels, cars and thousands of products across electronics, jewellery and fashion at the Reward Shop A Guest +1 voucher on annual spends of INR 10 lakh and INR 8 lakh on base and premier variant respectively 3-10% discount on direct Etihad Airways bookings Welcome gift of 5,000 and 2,500 Etihad Guest Miles upon enrolment into Etihad Guest SBI Premier Card and Etihad Guest SBI Card respectively Milestone benefits: 5,000 Etihad Guest Miles on annual spends of INR 5 lakh on Etihad Guest SBI Card and 1,500 Etihad Guest Miles on quarterly spends of INR 1.5 lakh on Etihad Guest SBI Premier Card. Complimentary membership to the Priority Pass Program worth USD 99 and complimentary visits to domestic and international airport lounges Complimentary overseas air accident coverage of INR 50 lakh and INR 25 lakh on premier and base variant respectively; complimentary fraud liability insurance cover of INR 1 lakh and INR 50,000 on premier and base variant respectively; lost baggage cover of up to USD 1000 Reversal of INR 1,499 annual fee for Etihad Guest SBI Card on annual spends of INR 3 lakh; reversal of INR 4,999 annual fee on annual spends of INR 5 lakh for Etihad Guest SBI Premier Card Επικοινωνήστε μαζί μας Ως πραγματικά διεθνής αεροπορική εταιρία, η Etihad Airways διαθέτει παγκόσμια παρουσία. Μάθετε πώς μπορείτε να επικοινωνήσετε με το πλησιέστερο σε σας γραφείο της Etihad Airways. Προβολή στοιχείων επικοινωνίας Παρατηρήσεις Αν θέλετε να μας στείλετε κάποιο θετικό ή αρνητικό σχόλιο να διατυπώσετε κάποιο παράπονο ή να κάνετε μια ερώτηση, παρακαλούμε κάντε κλικ εδώ Κάντε μας like Επισκεφθείτε τη σελίδα μας στο Facebook! Δείτε μας Επισκεφθείτε το κανάλι μας στο YouTube! Ακολουθήστε μας Etihad Airways | Προσφορές Etihad | Βοήθεια με την Etihad | Επιβραβεύσεις Etihad


text:
Pesticides in Baby Food: References
Carlson, Elisabeth, Aleksander Giwecman, Niels Keiding, and Neils E. Skakkebaek. 1992. Evidence For Decreasing Quality of Semen During Past 50 Years. British Medical Journal. 305:609-613.
Colburn, Theo, Frederick S. vom Saal, and Ana M. Soto. 1993. Developmental Effects of Endocrine Disrupting Chemicals in Wildlife and Humans. Environmental Health Perspectives. 101(5):378-384.
Environmental Protection Agency. 1994. List of Chemicals Evaluated for Carcinogenic Potential. Memorandum to Health Division by Reto Engler, PhD. April 1, 1994.
Farm Chemicals Handbook. 1994. Willoughby, Ohio. Meister Publishing.
Gray, Jr. and Leon Earl. 1992. Chemical-Induced Alterations of Sexual Differentiation: A Review of Effects in Humans and Rodents. Pp. 203-230 in Advances in Modern Environmental Toxicology, Mehlman, M.A., ed. Princeton, New Jersey: Princeton Scientific Publishing Co., Inc.
Guzelian, Philip S., Carol J. Henry, Stephen S. Olin. 1992. Similarities and Differences Between Children and Adults: Implications for Risk Assessment. ILSI Press: Washington, D.C.
Hileman, Bette. 1994. Environmental Estrogens Linked to Reproductive Abnormalities, Cancer. Chemical and Engineering News. January 31, 1994. pp. 19-23.
McConnell, Ernest. 1992. Comparative Responses in Carcinogenesis Bioassays as a Function of Age at First Exposure. Similarities & Differences Between Children and Adults. ILSI Press: Washington, D.C. p. 66-78.
National Research Council. 1993. Pesticides in the Diets of Infants and Children. National Academy Press: Washington, D.C.
Nielson Marketing Statistics. Baby food sales figures. February 18, 1994 through February 18, 1995. Obtained from Center for Science in the Public Interest.
Peto, R. et al. 1991. Effects on 4080 Rats of Chronic Ingestion of N-Nitrosodiethylamine or N-Nitroso-dimethylamine: A Detailed Dose-response Study. Cancer Research. 51:6415-6451. 1991.
Rier, Sherry E., Dan C. Martin, Robert E. Bowman, W. Paul Dmowski, and Jeanne L. Becker. 1993. Endometriosis in Rhesus Monkeys (Macaca mulatta) Following Chronic Exposure to 2,3,7,8-Tetrachloro-dibenzo-p-dioxin. Society of Toxicology. Fundamental and Applied Toxicology 102(3).
Ries, L., et al. 1993. Cancer in Children, SEER Cancer Statistics Review 1973-1990. U.S. Department of Health and Human Services. Washington, D.C.
Sharpe, Richard M. and Niels E. Skakkebaek. 1993. Are oestrogens involved in falling sperm counts and disorders of the male reproductive tract? The Lancet. 341:1392-95
Snodgrass, Wayne R. 1992. Physiological and Biochemical Difference Between Children and Adults As Determinants of Toxic Response to Environmental Pollutants. pp. 35-42 in Similarities and Differences between Children and Adults: Implications for Risk Assessment, Philip S. Guzelian, Carol J. Henry, Stephen S. Olin, eds. Washington, DC: International Life Sciences Institute.
Soto, Ana M., Kerrie L. Chung, and Carlow Sonnenschein. 1994. The Pesticides Endosulfan, Toxaphene and Dieldrin Have Estrogenic Effects on Human Estrogen-Sensitive Cells. Environmental Health Perspectives.
The Lancet. 1995. editorial. Male reproductive health and environmental oestrogens. 345 (8955): 933-935.
Toppari. Jorma et. al. 1995. Male Reproductive Health and Environmental Chemicals with Estrogenic Effects. Danish Environmental Protection Agency. Copenhagen, Denmark. April 1995.
U.S. Code of Federal Regulations. 1991. Protection of the Environment. Labeling requirements for pesticides and devices. 40


text:
Creek County OSU Extension Web Site
Welcome to the Creek County OSU Extension Web Site!
— filed under: News
Creek County OSU Extension Service gives our county's residents easy access to the resources and expertise of Oklahoma State University. Through educational programs, publications, and events, Cooperative Extension educators deliver unbiased, research-based information to Creek County citizens. We can answer your questions on a wide array of topics. To find out how we can help you, browse our site or contact us by email or phone.
Address: 17806 W. Hwy. 66
Kellyville, OK 74039
Phone: 918-224-2192


text:
In Charlotte, Democrats are poised to insist that their economic vision is better for America than that outlined by Mitt Romney; they insist the country is better off than it was four years ago. NBC's Chuck Todd reports.
DETROIT -- Amid a GOP-driven effort asking whether Americans are better off than they were four years ago, Vice President Joe Biden emphatically declared that "America is better off" now than at the end of the Bush administration.
"Folks, let me say something to you, say it to the press," Biden said at the conclusion of his remarks at a Labor Day rally here in the Motor City. "America is better off today than they left us when they left!"
The question, a staple of elections in which an incumbent is seeking re-election, has developed into a small media imbroglio since surrogates for President Barack Obama appeared hesitant this weekend to give a positive answer.
Democratic Maryland Gov. Martin O'Malley answered that question with a "no"; Obama advisers David Axelrod and David Plouffe offered nuanced responses but not a flat "yes."
Republicans pounced in the meanwhile, and the GOP held a press conference today in Charlotte, the site of the Democratic National Convention, to push that very question.
Biden's statement makes him the highest-ranking Obama surrogate to weigh in on the back and forth.
Repeating his frequent "bumper sticker" mantra, Biden said in Detroit: "If you want to know whether we're better off, I got a bumper sticker for you: Osama bin Laden is dead and General Motors is alive!"
Romney spokeswoman Amanda Henneberg said in response: "Today, Vice President Biden claimed that Americans are better off than they were four years ago, directly contradicting what President Obama and his campaign surrogates have said. The truth is that the middle class has been crushed in the Obama economy."
Biden, who spoke to several hundred supporters at the AFL-CIO-sponsored event, focused heavily on labor issues in his remarks and blasted Romney for opposing the Obama-backed bailout of the auto industry.
"Folks, you can't say you're going to create jobs in the United States of America when you were willing to let 1m jobs go under by the liquidation of the automobile plants he suggested," Biden said.
He also went after Republican vice presidential nominee Paul Ryan, repeating a line first debuted yesterday in Pennsylvania to attack the Wisconsin congressman's Medicare plans.
"We're talking about making sure to protect Medicare. They're talking about creating an entire new system, 'Vouchercare,'" he said, warning "if they win, people are in trouble."


text:
Live Review: Section M Reunion at Daredevils & Queens
Right from the start, I suppose I should admit, I hated Section M magazine. I didn't want anything to do with it, I didn't think it was helping the music scene, I wrote irritated letters to the editor, and I talked shit about it as much as I could.
Mainly, though, I was jealous, both of the writers—because I wasn't writing about music at the time—and of the bands covered, because I wasn't playing music at the time either. When Section M hit the stands in 1998, I was coming off a four-year spree of constant touring, and I was in a weird space. I was fueled by Tanqueray, mid-20s cynicism, and avant-garde jazz. I talked a lot, but I wasn't doing much of anything, really.
Also, at the time I was convinced, and not entirely erroneously so, that there were no good bands in Sonoma County whatsoever. Section M came along and seemed convinced otherwise. It proclaimed: Bands are great! We like all these bands! Bands, bands, bands!
Now, looking back with more clarity, I have a lot of respect for what the many volunteers at Section M pulled off. I marvel at how Section M ever could have been produced in the first place, let alone lasted as long as it did—from 1998 to 2003.
After all, this was the magazine that would hire basically anybody. When you've got an open-door policy, you open yourself up to flakes, crazies, egomaniacs, and just plain unqualified hopefuls. Put all those people in an room together, and they'll either start screaming obscenities at each other or having sex in the bathroom—both of which happened, in fact, at Section M's offices.
The inside workings of Section M often found their way into the pages, and staffers hooking up together wasn't rare. What was rare was them staying together. After torrential, reckless flings came to a crashing halt, work at the magazine could be painfully uncomfortable until one or the other quit. (To add to the tension, hookers prowled outside the office at all hours of the night.)
Phone calls to the magazine were either weird or very weird, culminating in the members of Derge leaving repeated, insane messages on the machine revealing their obsession with gay sex and racial epithets. On a similarly bizarre note, the band Bungworm once sent Section M a bag full of actual shit, which totally confused everyone at the magazine until an astute reader wrote in to point out that they'd been running an ad for months which read "Send Us Your Band's Shit."
Accompanied by this rare gift was a letter that demanded the magazine never write about the band ever again; in what amounts to the best example of Section M's attitude that I can conjure, the next issue was filled with as many references to Bungworm as possible. Yes, for all of its faults, this was Section M's greatness: it blatantly did not give a fuck about bands that took themselves too seriously, and instead devoted lots of column space to absolutely unserious bands like the H.B.'s or Rhino Rape.
Section M petered away in 2003 without fanfare—no official final issue, no grand goodbye. One could argue that it didn't really go away, living instead in the human form of Michael Houghton, the magazine's founder, who continued in social situations to casually remind people years afterwards of the many thousands of dollars of credit card debt he was still saddled with from running the magazine. It was hard to tell if these repeated references to the magazine's legacy of debt were subtle pleas for financial help, or if they pointed to something deeper—indicators, perhaps, of how hard it is to say goodbye to something that never got the chance to truly die.
Last weekend, Michael got that chance, as did about 400 other people who crammed through the doors of Daredevils & Queens for a night that was a reunion, a nostalgia fest and a damn good time rolled up into one. Over a dozen bands from the late 1990s got back together to perform. Michael, ever the dapper stylist, even got gussied up for the occasion—in a pair of jeans with a hole in the crotch, and a "F*ck Section M" T-shirt.
I showed up a little bit late, but immediately the "reunion" aspect was made clear. I ran into people, now married and pregnant, who I once stayed up drinking gallons of gin with until 3am. I ran into people who asked, "So, how's it going?" who didn't bother to explain if they were asking how it's been going for the last 10 years or the last 10 minutes. And I ran into people who referenced incredibly esoteric jokes I'd made back in 1999 with pinpoint precision—and this was all before I could make it out back to watch some bands.
Thus, the night was a blur, but in the best possible way. I played bass with the Blockheads, who hadn't played in a decade and whose bassist Mark Aver has since moved to the East Coast. It was the most satisfying 35 minutes of fun I've had in a while. To Dave Fichera, Paul Fichera, and Steve Choi, the Blockheads, the only local band I truly loved besides Cropduster in the late 1990s—thanks, bros.
I caught 20 Minute Loop, Cropduster, Brian Moss, and the Paranoids, but I think the greatest slice of reunion nostalgia for the night was the Reliables, who were all, like, 13 years old when they formed and maybe 17 when they broke up. It was just like an old Reliables show—equipment failures, not knowing how to use a tuner, confusion over which song was being played, the microphone stand falling over—except that instead of standing around dumbfounded, as most people did in 2001, the large crowd showered them with love.
The Reliables' set list canvassed the trajectory of adolescence, from early songs about suburban angst like "Sad Man" ("My mom just won't let me be / I know that I'm kind of a loser / Masturbation is only for Godzilla") to the totally awesome and bittersweet "Another Shitty Day" to the very last song the band ever wrote, "Houses Without Windows," a depressing, existential rumination on life at midnight as seen from an airplane window which asks the question: "Don't you wish sometimes you're dead?"
Not many people cared about the Reliables when they were around, but at the Section M reunion, bolstered by guest drummer Caitlin Love, they were basically superstars. "I think this is the most people we've ever played to," noted Jeremy, and he was right.
Piles upon piles of old Section M magazines were being given away at the front door (Worst cover ever? Issue #10: Halou, Cohesion, Kabala, and Skitzo) and I even saw a very dazed but very validated Michael Houghton for a second. "Can you believe this?" he asked, motioning to the incredibly packed Daredevils & Queens. "Look at all these people!" It's true. It was pretty amazing.
One final note: in honor of the 10-Year Anniversary of the magazine, Michael has allowed me to finally spill the beans about the "Scene & Heard" column in Section M, the gossipy, newsy column written by the elusive "Jane Sez." No one ever knew who Jane Sez was, and since "Scene & Heard" was easily the most popular column in every issue, there were many, many guesses over the years.
Now it can be told: Jane Sez was Michael Houghton. Well, for some issues, at least. The first few were written by Christine Alexander from Little Tin Frog, after which it turned over to Michael and then became a communal effort by Michael and the rest of the upper staff of the magazine, including Sara Bir. Keeping the Jane Sez identity a secret was almost as fun as writing the column itself, Michael says. "The best part about it is that so many dudes came up to me at shows, when I was doing most of the 'Scene and Heard' writing," he recalled the other night, "and they'd say to me, 'I'm so in love with Jane Sez. I totally wanna fuck her.'"
There's an excellent photoset from the night, taken by Caitlin Childs, over here.
Sara Bir, who worked for Section M as a writer and managing editor, takes a good hard look at the magazine both here, and elucidates even further here.
A few members of the staff from the magazine share their thoughts and opinions here.
Section M's official website, still up and running, is here.
Tags: Blockheads, Cropduster, Daredevils & Queens, Michael Houghton, Reliables, Reunion, Santa Rosa, Section M


text:
NetBeans 6.5 - The Untold Story
Although I already blogged about the recent release of NetBeans 6.5, I wanted to take some time to write about some of its less-covered areas of enhancement. Also, I wanted to cover some of the future goals that Sun has for NetBeans. Recently, I spoke with Sun's Kuldip Oberoi, Group Manager of Developer Marketing, about these two topics.
Also, Sun has enhanced its support for C/C++ developers, allowing them to develop locally on any supported platform, and then perform distributed builds on other computers/servers, and even remotely debug in, say, a remote production-like environment. Keep in mind that this requires shared access to your application's source files between the client developer machine and the server(s).
Another area of interest is NetBeans 6.5's enhancements around database-related development. This release includes an enhanced database connection interface to get you up and working your database as quickly as possible, and built-in support for database operations. This includes SQL command-based operations, as well as manual database edits. With this built-in tool, you can browse schemas, create tables, add columns to tables, and make updates inline all without leaving the NetBeans IDE.
NetBeans even maintains a SQL command history per table. Overall, it's not meant to be a replacement for a complete suite of database tools, but a lot of effort was put into allowing developers to stay within the IDE for the operations that they perform the most.
Future NetBeans Enhancements
One database-related feature being considered for a future release of NetBeans is the addition of entity relationship (ER) diagraming. Sun is thinking about the problem holistically; it would most likely to be implemented to solve mainly schema reporting use-cases, not necessarily database design-time requirements. The goal would not be to replace enterprise database development tools, but to help Java developers with their common database application development needs.
Also, with a future release, Python support will be finalized - currently it's an early access feature. Sun has noticed the growing population of Python developers, and the increasing attendance at PyCon this past year, and they plan to embrace the language more in the future.
Sun is continuing efforts to improve existing Java tools and their integration within NetBeans. Expect to see new code profiling tools for Java and other languages, which take new approaches to helping you analyze your application's code. As for language support within NetBeans, expect to see Scala--http://en.wikipedia.org/wiki/Scala_(programming_language)-- supported in the future.
Regarding the grand vision for NetBeans, Kuldip told me that Sun is looking to make it the development environment for cloud computing. This is both in terms of developer tools and services, as well as the deployment and maintenance of applications.
Happy coding!


text:
Pacific Medical Centers has agreed to enter a so-called "secular affiliation" with Providence Health & Services, the giant Catholic health-care system.
The proposed agreement, announced Monday,
calls for the Pacific Hospital Preservation & Development Authority, PacMed's sole corporate member, to transfer that membership to Western HealthConnect.
That's the entity set up by Providence to expand its operations, while allowing health companies that fall under its umbrella to continue providing some services the Catholic health-care system does not, such as contraceptives and sterilizations. Providence calls Western HealthConnect a secular organization, but it precludes affiliates from performing elective abortions, which have not been part of PacMed's practice.
The companies did not disclose the financial terms of the transaction.
Most Read Local Stories
- Coronavirus daily news updates, May 26: What to know today about COVID-19 in the Seattle area, Washington state, and the nation
- Coronavirus daily news updates, May 27: What to know today about COVID-19 in the Seattle area, Washington state, and the world
- New analysis may rewrite the history of Washington state's coronavirus outbreak
- How missed 'red flags' helped Nigerian fraud ring 'Scattered Canary' bilk Washington's unemployment system amid coronavirus chaos
- 'I'm hiding from the bank': How the bottom may be falling out of the coronavirus response
Providence spokeswoman Colleen Wadden said the deal would not require regulatory approval because "no hospital license is involved in this transaction and the affiliation will not adversely affect competition."
And while the companies would share administrative services, Wadden said Providence doesn't anticipate any layoffs. PacMed has nearly 800 employees.
In a news release, PacMed Chief Executive Harvey Smith said the company needed to join Providence to reduce costs for patients, employers and insurers while improving the quality of its care.
"On its own, PacMed cannot drive broad changes in the way that health care is delivered," Smith said. "We need to collaborate with an organization that has sufficient resources and a similar community-minded mission and vision to succeed."
PacMed, with its nine Seattle-area locations and 150 primary- and specialty-care providers, joins Renton-based Providence, which has 32 hospitals and 400 physician clinics. The health system employs more than 64,000 people in five states.
"Together, we can affect change on a much larger scale by sharing best practice and innovating collaboratively, not only in the Puget Sound region, but across the Providence system," Providence Chief Executive Rod Hochman said.
Two years ago, Providence entered into a similar secular affiliation with Swedish Health Services as it expanded its footprint in the Seattle area. While the affiliation was secular, Swedish decided to stop performing elective abortions "out of respect for the affiliation," a spokesman said at the time.
Instead, Swedish helped underwrite a Planned Parenthood center adjacent to the hospital, where it refers patients.
Like the Swedish deal, the PacMed arrangement is an affiliation rather than an acquisition, allowing PacMed to operate independent of the religious doctrine that guides Providence's health care.
"The intention is not for affiliates to become Catholic," Providence's Wadden said. "The intention is for us to work together."
Even though Western HealthConnect precludes the physicians of its affiliates from performing elective abortions, the companies said PacMed doctors and staff would not be subject to the Ethical and Religious Directives for Catholic Health Care Services, the U.S. Conference of Catholic Bishops rules that dictate the care that Catholic health systems can provide.
"The reproductive-health services PacMed offers will not change and PacMed patients will have the same access to the services that they currently receive," the companies said in their news release. "PacMed will continue to prescribe contraceptives and its physicians will continue to perform sterilizations and other procedures consistent with current practice."
Because PacMed does not perform elective abortions, Western HealthConnect did not need to require it to stop the procedures. Under the terms of the affiliation agreement, PacMed doctors would be allowed to continue referring patients seeking elective abortions to other providers.
The companies said PacMed doctors also would have no restrictions on conversations with patients about options available under Washington state's Death with Dignity Act.
Physicians at PacMed, who currently do not prescribe lethal medications, would be allowed to continue as consulting physicians for patients choosing physician-assisted death, but not as the main doctor involved.
PacMed began as a U.S. Public Health Service hospital on Beacon Hill overlooking downtown Seattle in 1933. It expanded in the 1980s, adding outpatient clinics in the Seattle area, and it launched a health-maintenance organization (HMO).
In 1987, it closed the hospital to focus on its HMO. But eight years later, it sold the HMO to focus on its outpatient clinics. In 2003, PacMed shifted from a city-affiliated public development authority to a private, not-for-profit organization.
The Pacific Hospital Preservation & Development Authority retained rights to approve transactions of this type when it restructured in 2003.
Providence isn't the only religious health-care system expanding through affiliations with secular providers in the region. Last May, UW Medicine and PeaceHealth, a not-for-profit system based in Clark County and founded by the Sisters of St. Joseph of Peace, announced a "strategic affiliation."
Jay Greene: 206-464-2231 or firstname.lastname@example.com. Twitter: iamjaygreene