ActiveObjectsエラー

java activeobjects

migrateで自動で生成してくれるのは非常に助かるけど勝手にテーブルをドロップするのがいかんせん慣れない。
今日も8つテーブルつくろうとしてマイグレーションしたら3つしかテーブルが生成されなかった。
テーブル構成がダメなのか実装がダメなのか...
ActiveObjects利用するときって自分でテーブル作った方がいいのかな?

UserProperty.java

public interface UserProperty extends Entity{
	
	public User getUser();
	public void setUser(User user);
	
        public String getHoge();
        public void setHoge(String hoge);
	
}

User.java

public interface User extends Entity{
	
	public String getName();
	public void setName(String name);
		
	@ManyToMany(Friend.class)
	public User[] getFriends();
	
	@OneToMany
	public UserProperty[] getUserProperties();
		
}

Friend.java

public interface Friend extends Entity{
	
	public User getFriend();
	public void setFriend(User friend);
	
	public User getUser();
	public void setUser(User user);
	
}
entityManager.migrate(User.class);
entityManager.migrate(UserProperty.class);
entityManager.migrate(Friend.class);

と実行すると

DROP TABLE userProperty

Oh...どういうことだ...

  • 追記
entityManager.gigrate(User.class,UserProperty.class,Friend.class);

で直った

初めてのActiveObjects

activeobjectsjavadb

公式ドキュメントのソースの写経です。

利用したライブラリ

Person.java

package sample;

import java.sql.Types;

import net.java.ao.Entity;
import net.java.ao.ManyToMany;
import net.java.ao.schema.SQLType;

public interface Person extends Entity{
	
	public String getName();
	public void setName(String name);
	
	public int getAge();
	public void setAge(int age);
	
	public String getEmail();
	public void setEmail(String email);
	
	@SQLType(Types.CLOB)
	public String getComment();
	
	@SQLType(Types.CLOB)
	public void setComment(String comment);
	
	public Family getFamily();
	public void setFamily(Family family);
	
	@ManyToMany(PersonToPerson.class)
	public Person[] getPeople();
}

Family.java

package sample;

import net.java.ao.Entity;
import net.java.ao.OneToMany;

public interface Family extends Entity{
	
	public String getName();
	public void setName(String name);
	
	@OneToMany
	public Person[] getPeople();

}

PersonToPerson.java

package sample;

import net.java.ao.Entity;

public interface PersonToPerson extends Entity {

	public Person getPersonA();
	public void setPersonA(Person person);
	
	public Person getPersonB();
	public void setPersonB(Person person);
}

Main.java

package sample;

import java.sql.SQLException;

import net.java.ao.EntityManager;

public class Main {

	public static void main(String[] args) throws SQLException {
		EntityManager manager = new EntityManager("jdbc:mysql://localhost/sample", "root", "root");

		manager.migrate(Person.class);
		manager.migrate(Family.class);
		manager.migrate(PersonToPerson.class);
		
		Family family = manager.create(Family.class);
		family.setName("Spiewak");
		family.save();

		Person me = manager.create(Person.class);
		me.setName("Daniel Spiewak");
		me.setAge(27);
		me.setComment("I love databasing");
		me.setFamily(family);
		me.save();

		Person you = manager.create(Person.class);
		you.setName("Joe Blow");
		you.setAge(23);
		you.setComment("Guess who?");
		you.setFamily(family);
		you.save();

		PersonToPerson relation = manager.create(PersonToPerson.class);
		relation.setPersonA(me);
		relation.setPersonB(you);
		relation.save();

		family.getPeople(); // ...returns new Person[] {you, me}
		you.getPeople(); // ...returns new Person[] {me}

		/*
		 * SQLを使用する最初の例
		 */
		Family[] families = manager.findWithSQL(Family.class, "familyID", "SELECT DISTINCT familyID FROM person");

		// ageが18以上のすべてのpersonを返す。
		Person[] overAge = manager.find(Person.class, "age >= ?", 18);

		/*
		 * 可変長パラメータと、ID値を意識しない、エンティティインスタンスの直接的な使用
		 */
		Person[] inFamilyOver21 = manager.find(Person.class, "age >= ? AND familyID = ?", 21, family);
		
	}
}

myBatis、Hibernateと違ってxml書かないのはとても楽。SQLも書けるみたいだし。これでいこう。
でもテーブル追加しようとして

Sample.java

package sample;

import net.java.ao.Entity;

public interface Sample extends Entity{

	public String getHoge();
	public void setHoge(String hoge);
}

これ追加して
Main.java

public static void main(String[] args) throws SQLException {
		EntityManager manager = new EntityManager("jdbc:mysql://localhost/sample", "root", "root");
		
		manager.migrate(Sample.class);
		
		Family[] families = manager.findWithSQL(Family.class, "familyID", "SELECT DISTINCT familyID FROM person");

		Person[] overAge = manager.find(Person.class, "age >= ?", 18);
		Person[] inFamilyOver21 = manager.find(Person.class, "age >= ?", 21);
		
		for(Person person : inFamilyOver21){
			System.out.println(person.getName());
		}
		
	}

で書き換えて実行したらPerson,Family,PersonToPersonのテーブルが全部消えた。なんでだろう

前からブログ始めてます

こんにちは。

TaRO改め@w1mvyです。

夏季休暇を終えて、新しくWebアプリを作っています。丁度良い区切りですので、今日から学習内容はこちらの方でまとめてようと思います。

しばらくはテーマをちょこちょこ変更する可能性が高いです…。

よろしくお願いします。

GAEでInvalidURLError

pythongaeflask
TwitterBotでマルコフ連鎖でもやるかーと思って作った。ローカル環境は正しく動くのにGAEに上げてURL叩いてもエラー吐く。原因もわからない。なんでだろ。

exception InvalidURLError()
要求の URL が有効な URL ではないか、サポートされていないメソッドを使用しています。サポートされているのは http と https URL のみです。

へぇ。

GAE上のエラー

E 10-08 12:39AM 08.344
Traceback (most recent call last):
E 10-08 12:39AM 08.344
File "/base/python_runtime/python_dist/lib/python2.5/wsgiref/handlers.py", line 92, in run
E 10-08 12:39AM 08.345
self.result = application(self.environ, self.start_response)
E 10-08 12:39AM 08.345
File "/base/data/home/apps/funya/2.345348482295564051/flask.py", line 644, in __call__
E 10-08 12:39AM 08.345
return self.wsgi_app(environ, start_response)
E 10-08 12:39AM 08.346
File "/base/data/home/apps/funya/2.345348482295564051/werkzeug/wsgi.py", line 406, in __call__
E 10-08 12:39AM 08.346
return self.app(environ, start_response)
E 10-08 12:39AM 08.347
File "/base/data/home/apps/funya/2.345348482295564051/flask.py", line 610, in wsgi_app
E 10-08 12:39AM 08.347
rv = self.dispatch_request()
E 10-08 12:39AM 08.348
File "/base/data/home/apps/funya/2.345348482295564051/flask.py", line 529, in dispatch_request
E 10-08 12:39AM 08.348
return self.view_functions[endpoint](**values)
E 10-08 12:39AM 08.348
File "/base/data/home/apps/funya/2.345348482295564051/application.py", line 88, in twi_markov
E 10-08 12:39AM 08.348
context = markov(morph(sentence = context))
E 10-08 12:39AM 08.350
File "/base/data/home/apps/funya/2.345348482295564051/markov.py", line 15, in morph
E 10-08 12:39AM 08.351
c = urlfetch.fetch(urllib.unquote(query),deadline=10)
E 10-08 12:39AM 08.351
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/urlfetch.py", line 241, in fetch
E 10-08 12:39AM 08.352
return rpc.get_result()
E 10-08 12:39AM 08.352
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", line 501, in get_result
E 10-08 12:39AM 08.352
return self.__get_result_hook(self)
E 10-08 12:39AM 08.352
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/urlfetch.py", line 319, in _get_fetch_result
E 10-08 12:39AM 08.353
raise InvalidURLError(str(err))
E 10-08 12:39AM 08.353
InvalidURLError: ApplicationError: 1

markov.py

# coding:utf-8
import urllib,urllib2
from BeautifulSoup import BeautifulSoup
import random
from google.appengine.api import urlfetch 

appid = "登録したID"
pageurl = "http://jlp.yahooapis.jp/MAService/V1/parse"

def morph(sentence = None, appid=appid, results="ma", app_filter="1|2|3|4|5|6|7|8|9|10|11|12|13"):
    ret = {}
    sentence = urllib.quote_plus(sentence.encode('utf-8'))
    query = "%s?appid=%s&results=%s&filter=%s&sentence=%s" % (pageurl, appid, results, app_filter, sentence)
    #c = urllib2.urlopen(query)
    c = urlfetch.fetch(urllib.unquote(query),deadline=10)
    soup = BeautifulSoup(c.read())
    surfaces = []
    for w in soup.ma_result.word_list:
        surfaces.append(w.surface.string)
    return surfaces

def markov(word_list=None):
    MAXGEN = 15
    nonword = "\n"
    w1 = w2 = nonword
    markov = {}
    content = ""
    for word in word_list:
        if not markov.has_key((w1,w2)):
            markov[(w1,w2)] = []
        markov[(w1,w2)].append(word)
        w1,w2 = w2,word
    if not markov.has_key((w1,w2)):
        markov[(w1,w2)] = []

    markov[(w1,w2)].append(nonword)
    w1 = w2 = nonword
    for i in range(MAXGEN):
        suf = markov[(w1,w2)]
        r = random.randint(0,len(suf) - 1)
        t = suf[r]
        if t == nonword:
            break
        content = content + t
        w1,w2 = w2,t
    return content

if __name__=='__main__':
    sentence = u'日本語入力テスト'
    surfaces = morph(sentence,appid=appid)
    for word in surfaces:
        print word

application.py

#coding: utf-8
from flask import Flask
app = Flask(__name__)
app.debug = True

from google.appengine.ext import db
from google.appengine.api import urlfetch

from flask import redirect, url_for, request, render_template, abort, flash, get_flashed_messages
import tweepy
import random
from markov import markov , morph

CONSUMER_KEY = '登録したの'
CONSUMER_SECRET = '登録したの'
TOKEN_KEY = '登録したの'
TOKEN_SECRET = '登録したの'

class Contexts(db.Model):
    context = db.StringProperty()

@app.route('/')
def index():
    return 'Hello'

@app.route('/post_form/')
def post_form(context=None):
    return render_template('form.html')

@app.route('/post_update/',methods=['GET','POST'])
def post_update():
    if request.method == 'POST':
        context = request.form['context']
        update(context)
        return redirect(url_for('post_form'))
    return 'Sample'

@app.route('/rnd_update/')
def rnd_update():
    query = Contexts.all()
    results = query.fetch(1000)
    result = results[random.randint(0,len(results)-1)]
    update(result.context)
    return result.context

@app.route('/insert_form/',methods=['GET','POST'])
def insert_form(context = None):
    if request.method == 'POST':
        context_str = request.form['context']
        cont = Contexts(context=context_str)
        db.put(cont)
    else:
        pass
    return render_template('insert_form.html')

@app.route('/update/')
def update(context = None,consumer_key = CONSUMER_KEY, \
    consumer_secret = CONSUMER_SECRET,token_key = TOKEN_KEY, token_secret = TOKEN_SECRET):
    if context != None:
        context = context.encode('utf-8')
        auth = tweepy.OAuthHandler(consumer_key,consumer_secret)
        auth.set_access_token(token_key,token_secret)
        api = tweepy.API(auth)
        api.update_status(context)
        return True
    return False

def get_API(consumer_key = CONSUMER_KEY,consumer_secret=CONSUMER_SECRET,\
    token_key = TOKEN_KEY,token_secret = TOKEN_SECRET):
    api = None
    auth = tweepy.OAuthHandler(consumer_key,consumer_secret)
    auth.set_access_token(token_key,token_secret)
    api = tweepy.API(auth)
    return api

@app.route('/markov/')
def twi_markov(context = None):
    api = get_API()
    timeline = api.friends_timeline(count=5)
    context = timeline[random.randint(0,len(timeline) -1 )].text
    for tweet in timeline:
        context = context + tweet.text
    context = markov(morph(sentence = context))
    context.replace('@',' ')
    #update(context = context)
    return context
    

# set the secret key.  keep this really secret:
app.secret_key = 'キー'

if __name__ == '__main__':
    app.run()
  • 追記

よくわかんないけど今もう一回上げなおしたら動いた。とりあえずcronまわしてしばらく様子見。application.pyの

#update..

の部分のコメントアウト外しただけなんだけどなー

FlaskでGAEやってたときに出たエラー

久しぶりにPython触ってほったらかしてたbotを動かしたら下記のエラーがでてきた。
コマンドは

sudo /usr/local/google_appengine/dev_appserver.py ./アプリケーションのパス

Traceback (most recent call last):
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 3206, in _HandleRequest
self._Dispatch(dispatcher, self.rfile, outfile, env_dict)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 3149, in _Dispatch
base_env_dict=env_dict)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 525, in Dispatch
base_env_dict=base_env_dict)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 2402, in Dispatch
self._module_dict)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 2312, in ExecuteCGI
reset_modules = exec_script(handler_path, cgi_path, hook)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 2208, in ExecuteOrImportScript
exec module_code in script_module.__dict__
File "/home/w1mvy/workspace/nya_n_/application.py", line 64, in
app.run()
File "/home/w1mvy/workspace/nya_n_/flask.py", line 316, in run
return run_simple(host, port, self, **options)
File "/home/w1mvy/workspace/nya_n_/werkzeug/serving.py", line 507, in run_simple
from werkzeug.debug import DebuggedApplication
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1287, in Decorate
return func(self, *args, **kwargs)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1937, in load_module
return self.FindAndLoadModule(submodule, fullname, search_path)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1287, in Decorate
return func(self, *args, **kwargs)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1839, in FindAndLoadModule
description)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1287, in Decorate
return func(self, *args, **kwargs)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1790, in LoadModuleRestricted
description)
File "/home/w1mvy/workspace/nya_n_/werkzeug/debug/__init__.py", line 14, in
from werkzeug.debug.repr import debug_repr
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1287, in Decorate
return func(self, *args, **kwargs)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1937, in load_module
return self.FindAndLoadModule(submodule, fullname, search_path)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1287, in Decorate
return func(self, *args, **kwargs)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1839, in FindAndLoadModule
description)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1287, in Decorate
return func(self, *args, **kwargs)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1790, in LoadModuleRestricted
description)
File "/home/w1mvy/workspace/nya_n_/werkzeug/debug/repr.py", line 24, in
from werkzeug.debug.utils import render_template
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1287, in Decorate
return func(self, *args, **kwargs)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1937, in load_module
return self.FindAndLoadModule(submodule, fullname, search_path)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1287, in Decorate
return func(self, *args, **kwargs)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1839, in FindAndLoadModule
description)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1287, in Decorate
return func(self, *args, **kwargs)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1790, in LoadModuleRestricted
description)
File "/home/w1mvy/workspace/nya_n_/werkzeug/debug/utils.py", line 12, in
from werkzeug.templates import Template
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1287, in Decorate
return func(self, *args, **kwargs)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1937, in load_module
return self.FindAndLoadModule(submodule, fullname, search_path)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1287, in Decorate
return func(self, *args, **kwargs)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1839, in FindAndLoadModule
description)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1287, in Decorate
return func(self, *args, **kwargs)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1790, in LoadModuleRestricted
description)
File "/home/w1mvy/workspace/nya_n_/werkzeug/templates.py", line 14, in
from compiler import ast, parse
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1287, in Decorate
return func(self, *args, **kwargs)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1937, in load_module
return self.FindAndLoadModule(submodule, fullname, search_path)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1287, in Decorate
return func(self, *args, **kwargs)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1839, in FindAndLoadModule
description)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1287, in Decorate
return func(self, *args, **kwargs)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1790, in LoadModuleRestricted
description)
File "/usr/lib/python2.6/compiler/__init__.py", line 27, in
from compiler.transformer import parse, parseFile
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1287, in Decorate
return func(self, *args, **kwargs)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1937, in load_module
return self.FindAndLoadModule(submodule, fullname, search_path)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1287, in Decorate
return func(self, *args, **kwargs)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1839, in FindAndLoadModule
description)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1287, in Decorate
return func(self, *args, **kwargs)
File "/usr/local/google_appengine/google/appengine/tools/dev_appserver.py", line 1790, in LoadModuleRestricted
description)
File "/usr/lib/python2.6/compiler/transformer.py", line 29, in
import parser
ImportError: No module named parser

どういうことや...

CakePHPでバリデーション

CakePHPのAuthコンポーネント利用してパスワードをハッシュ化して保存する。
CakePHP:パスワード登録時のバリデーション: 机上の楼閣
ここにのっているように一度ただのテキストフォームに入力させてそれにバリデートかけてAuth->password()を通してハッシュ化して保存する。なるほど!

TwitterをGoogleにしてみた

[Firefox][Greasemonkey][Stylish]

FirefoxのアドオンであるGreasemonkey – 🦊 Firefox (ja) 向け拡張機能を入手を使ってTwitterのホームをGoogleの検索ページに似せてみた。これで後ろから誰かに見られても平気だよ!授業中、仕事中...先生や上司に見られてもGoogleで検索してるようにしか見えないよ!!保証できないけど!

こんな表示になります。検索バーがツイートするテキストフィールドで「Google検索」ボタンがツイートボタンです。I'm Feelingは特になにもないです。適当にリンクを張ってください。右上の「検索設定」からログアウトできます。

Greasemonkey
twitter.user.js

// ==UserScript==
// @name           twitter++
// @namespace      hoge
// @description    twitterplus
// @include        http://twitter.com/*
// ==/UserScript==
(function(d, func) {
    var check = function() {
        if (typeof unsafeWindow.jQuery == 'undefined') return false;
        func(unsafeWindow.jQuery); return true;
    }
    if (check()) return;
    var s = d.createElement('script');
    s.type = 'text/javascript';
    s.src = 'http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js';
    d.getElementsByTagName('head')[0].appendChild(s);
    (function() {
        if (check()) return;
        setTimeout(arguments.callee, 100);
    })();
})(document, function($) {
    // ここにメインの処理を書く
    
    var url = 'http://www.google.com/intl/en_com/images/srpr/logo1w.png';
    $('div#status_update_box').prepend(
    	'<div id="google_wrapper" style="padding-top : 30px; padding-bottom : 10px">'
			+'<div id="google_logo">'
				+'<div style="color: rgb(119, 119, 119); font-size: 16px; font-weight: bold; left: 214px; position: relative; top: 70px;" nowrap="">日本</div>'
			+'</div>'
    	+'</div>');
	$('textarea#status').attr({'rows':'1','cols':'1','font-size':'23px'});
	$('a#tweeting_button').children('span:first').text('Google検索');
	
	$('div#status_update_box').after(
		'<div id="google_footer" style="padding-top:20px">'
			+'<span>'
				+'<center style="opacity: 1;">'
					+'<div style="font-size : 10pt;">'
						+ '<div id="fil" style="margin: 19px auto; text-align:center;">'
							+'<a href="http://twitter.com/" class="google_link" style="margin: 0px 10px 0px 10px">広告掲載</a><a href="http://www.google.co.jp/" style="margin: 0px 10px 0px 10px">Google について</a>'
								+'<b><a href="http://www.google.com/ncr" class="google_link" style="margin: 0px 10px 0px 10px">Google.com in English</a></b>'
						+ '</div>'
					+'</div>'
					+'<div style="text-align: center;">'
					+'<p style="color: rgb(118, 118, 118); font-size: 8pt;">'
						+'&copy; 2010 -'
						+'<a href="http://twitter.com/" class="google_link">プライバシー</a>'
					+'</p>'
					+'</div>'
				+'</center>'
			+'</span>'
		+'</div>'
	);
	
	$('body').prepend(
		'<div style="border-bottom : 1px #C9D7F1 solid; height : 23px;" height="23px">'
			+'<div style="padding : 3px 8px 0px 8px">'
				+'<div id="gbar" style="text-align : left; float:left; font-size: 13px">'
					+'<nobr>'
						+'<b>ウェブ</b>'
						+'<a class="google_link" href="http://www.google.com/imghp?hl=ja&tab=wi">画像</a>'
						+'<a class="google_link" href="http://video.google.com/?hl=ja&tab=wv">動画</a>'
						+'<a class="google_link" href="http://maps.google.com/maps?hl=ja&tab=wl">地図</a>'
						+'<a class="google_link" href="http://books.google.com/bkshp?hl=ja&tab=wp">ニュース</a>'
						+'<a class="google_link" href="http://books.google.com/bkshp?hl=ja&tab=wp">書籍</a>'
						+'<a class="google_link" href="http://mail.google.com/mail/?hl=ja&tab=wm">Gmail</a>'
						+'<a class="google_link" href="http://www.google.com/intl/ja/options"><u>その他</u><small>▼</small></a>'
					+'</nobr>'
				+'</div>'
				+'<div id="guser" width="100%" style="text-align : right; font-size : 13px;">'
					+'<nobr>'
						+'<span></span><span></span>'
							+'<a class="google_link" href="http://www.google.com/ig?hl=ja&source=iglk">iGoogle</a>'
							+'|'
						+'<span>'
					+'<a class="google_link" href="http://twitter.com/logout">検索設定</a>'
					+'|'
					+'<a class="google_link" href="http://twitter.com/login">ログイン</a>'
					+'</nobr>'
				+'</div>'
			+'</div>'
		+'</div>'
		);
	$('body').append(
		'<div id="google_footer2" style="height: 20px; position: relative; margin: 0.8px; padding: 0px 5px 10px 0px;">'
			+'<font size="-1">'
				+'<div id="" class="" style="opacity: 1; text-align : left;">'
					+'<a href="#">背景画像を変更する</a>'
				+'</div>'
			+'</font>'
		+'</div>');
		
	$('#tweeting_controls').css('float','none');
	
	$('a#tweeting_button').css({
		'width':'99px',
		'height':'20px',
		'display':'inline-block'
	});
	$('a#tweeting_button').removeClass('btn-disabled').css('-moz-border-radius','0px');
	$('div#tweeting_controls').append(
		'<a id="hoge" class="a-btn a-btn-m" tabindex="2" herf="#" style="width : 118px; height: 20px; -moz-border-radius : 0px 0px 0px 0px; border-color : #CCCCCC #999999 #999999 #CCCCCC; border-style: solid; display : inline-block;">'
			+'<span>I\'m Feeling Lucky</span>'
		+'</a>');
		
	$('body').css('background','#FFFFFF');
	$('div#recommended_users').css('display','none');
	$('#timeline_heading').css('display','none');
	$('#timeline').css('display','none');
	$('#footer').css('display','none');
	$('div.bar').css('display','none');
	$('#header').css('display','none');
	$('#latest_status').css('display','none');
	$('.section').css('display','none');
	$('#side_base').css('display','none');
	$('div#google_logo').css({
		'background': 'url(http://www.google.com/intl/en_com/images/srpr/logo1w.png) no-repeat scroll 0 0 transparent',
		'width':'276px',
		'height':'110px',
		'margin-left':'auto',
		'margin-right':'auto',
		'text-align':'left'
	});
	
	$('textarea#status').css({
		'width':'496px',
		'height':'25px',
		'-moz-border-radius':'0px'
	});
	
	$('div.info').css('text-align','center');
	
	$('body#home.timeline > div').css('padding','1px');
	
	$('body#home.timeline > div > div#gbar > nobr > a').css({
		'margin': '5px',
		'padding': '3px'
	});
	
	$('a.google_link').css({
		'color':'#0000cc',
		'padding':'5px'
	});
	
	$('body').css('height','100%');
	
	$('div#container').css({
		'min-height':'100%',
		'height':'auto',
		'margin':'0 auto -80px',
		'height':'100%'
	});
	
	$('#google_footer2').css({
		'position':'absolute',
		'bottom':'0px'
	});
	
	$('a#tweeting_button').css('width','85px');

		
});

windowsだとグリモンのデフォルトの文字エンコードs-jisになっていて、UTF-8文字コードを変更しないと日本語が文字化けするので注意。

色々と本物と違いますが誤差の範囲としました。チラッて見られたぐらいじゃわからない...はず。