2010/03/31

[Google App Engein]Python2.6でも動きました

実は、Google App Engineを使って無料でサイトを立ち上げる方法を見て、windows版のGAEだとPythonが2.6でも動くということを知ったので、macでも動くのかなーっと検証したところ、問題なく動かすことができました。

なので、snow leopardでもmac portsを通して2.5をインストールしなくても大丈夫なんですね。

めんどくせーことが一つ減るのでラッキー♪

2010/03/30

[Python]Python4PHPer 第4回講習会に参加しました

PHP使いでPythonかつGoogle App Engineに興味があり、初めてという方を対象に、今回セミナーが開催され、参加させていただきました。

Pythonとは何ぞや?という話から始まり、Google App Engineに自作したアプリケーションをのせて実際に実行するまでを勉強しました。

参加させていただいて大変有意義な時間をすごすことができて充実した一日だった反面、あそこまで講義する必要はあったのかなーと正直疑問に思ってしまいました。

もし、講義のタイトル通りPythonを最初から学びからGoogle App Engineに簡単なアプリケーションを乗せるだけなら、Classまでの説明で例外から先の説明はいらないんじゃーないのかなーっと。
ましてや、イテレータや、ジェネレータ、高階関数などの説明は本当に必要だったのでしょうか?
(少なくともGoogle App Engineに自作したwebアプリケーションをのせる段階では必要ありませんでした。)
さらにPHPを使う人って普段あそこまでコアな部分まで使っているのかすっげー疑問に思ってしまった。

そこで提案があるのですが、講義の内容をいくつかに分割するのはどうでしょうか?

Python初心者向け講義(GAEの簡単な説明も含む)
Python中級者向け講義(ジェネレーター、イテレーターなど)
Python上級者向け講義
GAEのDataStoreの部分に特化した講義(mail、account)
GAEのDataStore以外の部分に特化した講義

がざっと思いつきました。

そうすれば、200ページを超えるパワポを半分ぐらいに減らすことができるし、受講生の集中力も持続させることができるんじゃーないのかなーっと。

2010/03/29

[24]シーズン8で終了

ガーン、ショックすぎるこの記事

テロリストを追う捜査官を主人公にした米テレビドラマで、日本でも人気の「24」が現在米国で放映中の第8シーズンを最後に終了する

via:米の人気TVドラマ「24」、今シーズンで終了へ

まだシーズン7を見ていないので、8がどうなるのか全然わからないんだけど、さびしいなー。。。

YouTubeには、既に予告編もアップされているみたいです。

2010/03/28

[Google App Engine]Djangoをインストールする必要があるのでしょうか?

↓のエントリーなのですが、
floatingdays: Windowsに Google App Engine開発環境 + Django 1.1をセットアップする
これ、Djangoをインストールする必要があるのでしょうか?

というのも、Google App Engineをインストールした時点で、Djangoはビルトインされていると思うのですが。。。

現にマニュアルを読むとそう書いてあります。

For your convenience,
the webapp module includes Django's templating engine.
This is included with the SDK and is part of App Engine, so you do not need to bundle it to use it.

via:Using Templates

うーん、行間を読み間違えているのだろうか??

2010/03/27

[Python](有効桁数|誤差)について

以下のPythonコードを実行すると、エラーが発生する

>>>a = 3
>>>b = 4
>>>b/(2.0+a)
0.80000000000000004

本来ならば、0.80を表示してほしいのだが、実際、0.00000000000000004の誤差が発生しています。
小数点が発生する計算の場合には気をつけたいところです。

2010/03/26

[Google App Engine]リダイレクト先の設定

昨日のエントリーでは、ログインシステムを構築する方法について書きました。

昨日紹介したプログラムでも稼動するのですが、(ログイン|ログアウト)した後リダイレクト先を設定していないので融通がききません。

そこで、今日は、リダイレクト先が設定できるようにしたいと思います。

まず、前提としてリダイレクト先は、staticファイル、つまり性的ファイルを表示することを念頭におきます。

すると、app.yamlの設定

handlers:
- url: /login
static_files: hoge.html
upload: hoge.html

- url: /logout
static_files: ./foo.html
upload: ./foo.html

- url: /.*
script: test.py

ここでは、loginした後、/loginディレクトリという名のもとで、実際には、hoge.htmlを表示し、一方でログアウトした時は、/logoutという名目でfoo.htmlを表示するように設定しています。

test.pyは↓
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.api import users

class MyHandler(webapp.RequestHandler):
def get(self):
user = users.get_current_user()
if user:
greeting = ("Welcome, %s! (<a href=\"%s\">sign out</a>)" %
(user.nickname(), users.create_logout_url("/logout")))
else:
greeting = ("<a href=\"%s\">Sign in or register</a>." %
users.create_login_url("/login"))

self.response.out.write("<html><body>%s</body></html>" % greeting)


application = webapp.WSGIApplication(
[('/', MyHandler)]
, debug=True)

def main():
run_wsgi_app(application)

if __name__ == "__main__":
main()

実際に動かしてみると正常に動作しました。

これで(ログアウト|ログイン)した後のリダイレクト先が設定できるのでより便利になりました。

2010/03/25

[Google App Engine]Googleのアカウントでログインする画面

ユーザーさんにGoogleのアカウントでログインしてもらって、そのメアドや他の情報を使ってアプリを作りたい局面があると思います。

今日は、そのやり方について。

といっても、Using Google Accounts in Pythonにちょこっと手を加えてだけなのですが。

from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.api import users

class MyHandler(webapp.RequestHandler):
def get(self):
user = users.get_current_user()
if user:
greeting = ("Welcome, %s! (<a href=\"%s\">sign out</a>)" %
(user.nickname(), users.create_logout_url("/")))
else:
greeting = ("<a href=\"%s\">Sign in or register</a>." %
users.create_login_url("/"))

self.response.out.write("<html><body>%s</body></html>" % greeting)

application = webapp.WSGIApplication(
[('/', MyHandler)]
, debug=True
)

def main():
run_wsgi_app(application)

if __name__ == "__main__":
main()

usersクラスをどうやって使うのかというところがキーポイント。

users.get_current_user()でログインしているかどうか確認をして、ログインしていない場合、Noneを返すのでifで処理を分岐させることができます。

ログインしている場合は、最初の分岐に入るのですが、user.nickname()でニックネームの表示を行い、users.create_logout_url("/")でログアウト先のurlリンクを作成しています。
create_logout_urlメソッドの引数はログアウトした後のリダイレクト先を設定するのですが、これについてはまた後日詳細を書きたいなと。
同様に、ログインしていない時はelseに入り、create_login_url("/")の返り値が、ログイン先のurlで、引数がリダイレクト先のURLなのですが、こちらもまた同様に後日書きたいなと。

すごくざっとですが、これでログインの画面を作ることができるのかなーっと。

2010/03/24

[Google App Engine]アプリケーションの削除について

10個しか無いのでこれは割と重要な情報だと思いました。

via:GAEでアプリを削除するには? [ GAE ]

に加えてもう一つ重要なことが。

一度削除してしまうと、もう一度、同じURLでアプリケーションの作成を行えなくなる

ということがあります。

アプリを削除したけど、もう一回、同じURLでチャンレジしてみたいという機会が結構あると思うんだけど、それができないので注意したいところ。

2010/03/23

[JavaScript]URLを取得する

JavaScriptからURLの取得ができるみたいです。

下記のコードで確認可能

document.URL;

2010/03/22

[Google App Engine]Google公式ブログで紹介

すっげータイムリーな記事を発見
Google Japan Blog: Google App Engine をはじめてみよう

是非、GAEの世界へ!!

[JavaScript]親画面の関数を小画面でコール

今日は、一発野郎ネタで

親画面の関数を小画面でコールを行う場合は、

window.opener.func関数名();

でいけちゃいます。

2010/03/21

[本]100億稼ぐ超メール術 1日5000通メールを処理する私のデジタル仕事術

こちらも読了していました


プロローグ 電子メールで仕事は100倍効率化できる!(メールはビジネスのやり方を根底から変える最強のツールだ
メールを使った3つの秘密兵器を使いこなせ)
第1章 1000人の部下を1人で管理する日報メールの破壊力(日報メールと360度評価でフェアでフラットな組織作り
日報メールで労務管理とコスト計算まで行う画期的システム ほか)
第2章 会議メーリングリストは会議の99%を不要にする(1000以上も存在するライブドアのメーリングリスト
これがメーリングリストで行われているやりとりだ ほか)
第3章 堀江流・これが私の実践メールテクニックだ!(メールは受信した分からどんどん処理するのが大原則
ウイルスメールと迷惑メールを自動的に処理する ほか)

via:目次

本書は、元livedoor CEOの堀江さんが、メールを駆使した仕事術について記した一冊。

実は、本書を読んですぐに社内に導入したのが、メールを使って社員を管理する方法。
実際に、システムを自作して社内で日報管理システムを導入しました。

導入して6ヶ月たちますが、社内で最初から導入されていた週報より全然役に立っているんじゃーないのかなーという自負があります。

これが便利なのは、

各メンバー社員の行動を把握できる。
提出が義務なので、さぼることができない。
新しいメンバーが入ってもどんな仕事を振ればいいのかすぐに判断できる。
次の日の予定をあらかじめ伝えることができる。
今、自分が何をやっているのか把握できる。
仕事のアーカイブ化ができる。

などなどができること。

社内での仕事は、システム開発なので、売上げなどの項目はないのですが、営業系のチームの場合、項目として追加してもいいかもしれません。
後、勤務時間等も含めることで、単位時間当たりの売上げなども分析することができるのかなと。

これをもっと応用させてGoogle Readerを使ってFeedで確認した方がより便利かなーと思って、後輩社員に頼んだら暗黙的に断れました。
RSSで確認できるとメールを読む必要性がへるので。

まーどうして必要なのかわからないからしょうがないのかもしれない。
もっと言ってしまうと、RSSが何なのかもわからないのかもしれない。
これ以上言ってもしょーがいないので、もう言わないけど。

話がそれてしまいましたが、後、メールで仕事を管理するのが便利なのは、管理者が自宅で勤務していてメンバーが外で働いているシチュエーションの時など。

子育てに追われて中々、仕事場にいけない管理職のお母さんなどにすごく役に立つと思うんだけど。
他にもトレイで確認できたり、今じゃーiPhone、iPadで確認もできるし。
いいことずくめ。

堀江さん曰く、この続編的なものが出版される予定とのこと。

Google APPSを駆使した全方位的な仕事術などを書いてほしいなーっと。

是非、メールを使った仕事管理術に興味のある方は、本書を。

2010/03/20

[本]詳解 正規表現 第3版

読了




はじめに

1章 正規表現入門

2章 初心者向けのサンプル

3章 正規表現の機能と方言

4 章 正規表現処理のメカニズム

5章 正規表現の実践的なテクニック

6章 効率のよい正規表現の作り方

7 章 Perl

8章 Java

9章 .NET

10章 PHP

索引

via:目次

初めて本格的な正規表現の本を読みましたが、本書はかなり濃厚な作品です。

ただ正規表現の方法を説明するだけではなく、正規表現を実行するエンジンの説明があったり方言ごとの説明があったりと、ここまで書くのかーと思わず唸ってしまいました。

読了後、すべて内容がわかったかと聞かれれば、首を縦にふることはできない。
おそらく何回か読む必要があると思うし、逆にそうすべきかとも思った。

要所、要所、リファのようにまとめページがあるので、そこに付箋をはっておけば、とりあえずは使えるようにはなっています。

当然ですが、本書はプログラミング言語初心者にはまったく向かない本であり、言語毎の正規表現の使い方が7章以降に書かれているのですが、まずは、6章まで目を通すことをお勧めします。

ここからは要望なのですが、
フクロウ本も三代目 - 書評 - 詳説 正規表現 第3版
にあるようにJavaScriptの項目を追加してほしいなーっと。
さらに、
Objective-C|C
Python
Ruby
の項目も追加してほしいです。

いまや上の言語はとても人気のある言語になってきているよう思います。
Objective-C|Cは、iPhone
Pythonは、GAE
RubyはRuby on Rails
と、それぞれ確立されあばサービスないしフレームワークが存在するのだから。

だけど、これを追加すると一体本書な何ページになってしまうのだろうか?

既に480ページは超えているのに。

でも、やっぱりこの部分は必要だと思う。
書く言語毎に別冊にしてもいいかもしれない。

2010/03/19

[Google App Engine]EntityのKeyを取得

Google App Engineのデータストアで比較的特徴的なのは、Entityというデータモデル。
(データモデル自体複数のモデルがあるのですが、それは追々)

で、Entityは作ってそれで終了ではなく親にして、さらに子供のEntityを作ったり、友達同士のEntityが集まったり、Entityグループというのが存在します。

そこで、EntityとEntityと結びつける上に重要になるのが、Entity特定するキー。

調べてみたところ、インスタンスメソッドのkey()メソッドで取得することができます。
ここで重要なのは、putメソッドを使った後ではないと、key()メソッドがコールできない点。

したがってそれを踏まえたうえで実装すると、こんな感じになる。

hoge = ClassHoge()
hoge.put()
hoge.key()

実際に実行してみたところ、キーを取得することができました。

まだ、この取得したキーをいかして、Entityグループを作るところまでは進んでいないのですが、とりあえず一歩前進したと思います。

話は変わるんですけど、アマゾン徘徊していたらアバターのDVDを発見。もうでちゃうんだー。まだ映画上映しているのに。

2010/03/18

[Google App Engine]トランザクション処理

昨日のエントリーでは、データを登録する方法を書いたので、今日は、トランザクション処理について。

import cgi
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext import db

#データモデル
class PaintingData(db.Model):
personalid = db.StringProperty()

def insert_data(*args):
#トランザクションの実行
paintingdata = PaintingData()
paintingdata.personalid = args[0].request.get("personalid")
#コミットをかける
paintingdata.put()


class StoringData(webapp.RequestHandler):
def post(self):
# print self.request.get("hoge")

try:
db.run_in_transaction(insert_data,self)
except:
print "エラーが発生しました。"

#データを表示する
def get(self):
paintingdata = db.GqlQuery("SELECT * FROM PaintingData")
for each_paintingdata in paintingdata:
self.response.out.write("<div>personalid:%s</div>" %
each_paintingdata.personalid)

application = webapp.WSGIApplication(
[('/paint/storingdata', StoringData)]
, debug=True
)


def main():
run_wsgi_app(application)

if __name__ == "__main__":
main()

db.run_in_transactionファンクションの使い方がわからなかったため、ちょっとてこずりました。

リファレンスを読むと第一引数は、関数の名前なのはすぐにわかったのですが、第二引数と第三引数に悩みました。

初めてのPythonを参考にすると、「*args」は、引数をタプルで受け取り、「**kargs」は、ディクショナリで受け取ると書いてあったので、今回は、タプルで渡したいと思い、第三引数を何も指定せずに、関数の設定を行ったところ、きちんと正常動作しました。

呼び出される関数(第一引数)の引数もタプルで設定してあるため、db.run_in_transactionの第二引数がそっくりそのまま引き渡される形になります。

後は、例外処理を細かく書いていけばオッケーかなーっと。

2010/03/17

[Google App Engine]Storing Dataを使ってDataをStore

Google App Engineの最大の特徴の一つといってもいいStoring Dataを使ってDataを登録する方法を書いてみたいと思います。

import cgi
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext import db

#データモデル
class PaintingData(db.Model):
personalid = db.StringProperty()

class StoringData(webapp.RequestHandler):
def post(self):
# print self.request.get("hoge")

#トランザクションの実行
paintingdata = PaintingData()
paintingdata.personalid = self.request.get("personalid")

#コミットをかける
paintingdata.put()

#データを表示する
def get(self):
paintingdata = db.GqlQuery("SELECT * FROM PaintingData")
for each_paintingdata in paintingdata:
self.response.out.write("<div>personalid:%s</div>" % each_paintingdata.personalid)

application = webapp.WSGIApplication(
[('/paint/storingdata', StoringData)]
, debug=True
)

def main():
run_wsgi_app(application)

if __name__ == "__main__":
main()

実際に、実行してみるとデータが保存されました。

で、確認方法ですが、このアドレスを直接参照すると、getメソッドがコールされるので、そこでGQLをかまして結果の表示を行いました。

これ最初できたとき、超感動しました。

ですが、正直、このプログラムにはまだ問題点があって、

トランザクションが失敗した時の例外処理をどうするのか?
登録時にform変数のエスケープを行わなくていいのか?

などがあります。

これらの対処方法については今、調査中なのでおいおい書いていきたいと思います。

↓の本、まだ立ち読みしていないのでわからないのですが、関数がいっぱい書いてあるようなら買おうかなー。

2010/03/16

[Google App Engine]を始めた理由

どうしてGoogle App Engineを始めたかといいますと、

1:iPhoneのアプリ or google gadgetで入力されたデータを保持する
2:グローバル対応したwebサービスを構築した場合、多量のデータをさばける必要がある
(⇒スケーラビリティを考慮する必要がない)
3:安定した稼動
(⇒ロリポップが不安定)
4:アプリケーション間のデータ統合

があげられるかなーっと思ったからです。

1に関しては、基本的にiPhoneで入力したデータはwebを使わない限り下記の方法しか端末上でデータを蓄積することができません。

sqlite
ファイル
core data

これに加えてwebをつなぐとなると、レンタルサーバーにあるmysqlかsqliteを使う手もあるのですが、容量がクラウドよりも小さいので、2を考慮してしまう場合、どうしてもこの方法を採用しにくくなってしまいます。

3に関しては、今、ロリポップでigoogle gadgetを提供させていただいているのですが、しょっちゅう、使えなくなってしまうので、もっと安定して提供できないのかなーっと。
しかも、Google App Engine上で、提供できれば、500万アクセスは無料でさばけるので、ひょっとしたらレンタルサーバーを借りる必要性もないのかなーっと最近思い始めたのです。

で、最後の4は、Google App Engine上で管理してしまえば、iPhone、mixi、iGoogle gadgetなどプラットフォームを意識せずユーザーさんのデータを表示したり編集できたりするのですごい便利なんですよ。

というわけで、最近、Google App Engineの勉強を始めました。

Google App Engine for Pythonの書籍が結構でているみたいだけど、あまり評判はよくなさそうだ。

2010/03/15

[Google App Engine]Form変数(POST送信によるデータ)を受け取る

参考になるかどうかまったわかりませんが、やっとForm変数(POST送信による変数)を表示する方法について書きたいと思います。

#app.yaml

application: paint
version: 1
runtime: python
api_version: 1

handlers:
- url: /paint/storingdata
script: storingdata.py

#storingdata.py
import cgi
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext import db

class StoringData(webapp.RequestHandler):
def post(self):
print self.request.get("hoge")

application = webapp.WSGIApplication(
[('/paint/storingdata', StoringData)]
, debug=True
)

def main():
run_wsgi_app(application)

if __name__ == "__main__":
main()

#任意のhtmlファイル(ここではtest.htmlとします)
<html>
<head>
</head>
<body>
<form name="testform"
action="http://localhost:8080/paint/storingdata"
method="post"
>
<input type="hidden"
name="hoge"
value="Hello Form Value"
>
<input type="submit" value="Run">
</form>
</body>
</html>

test.htmlをローカルかつ任意の場所で開いて「Run」ボタンを押すと、きちんと「Hello Form Value」が表示されました。

でもこれって、Google App Engineに書いてあるHandling Forms with webappの解説とどう違うんだよーという感じがありますが、ポイントとしては、違うディレクトリでPOSTされたデータを表示している点が違います。

リファレンスだと同じディレクトリで送信されたPOSTデータを表示しているだけなのです。

また、これができることで、Google App Engine上にはないディレクトリから送信されたデータを拾うことができるということです。

もっと言ってしまうと、Ajaxでデータを送信してデータを拾いたい場合もこのやり方が通用すると想定しています。
(なのでタイトルに、POST送信によるデータと書きました。)

徐々に徐々にですが前進してきました。

しかし、Pythonはプログラムをコンパイルをインデントで処理しているため、横に長くなりそうだなー。

きちんとブログに書ききれるかどうか若干不安です。

2010/03/12

[iPhone]ファイナルファンタジーをゲット

ついつい勢いでゲットしてしまった。
ファイナルファンタジー

初作は今までやったことがなかったので、すごく新鮮。
Photobucket

2010/03/11

[JavaScript]firefoxで座標を取得する方法

過去のエントリーを探してもみつからなくて、かつ同じ悩みを抱えている人がいました。

javascript
IEだと下記でマウス座標が取得できます。
x = event.screenX
y = event.screenY
FireFox(できれば他も)で同様の処理を行う方法を教えてください。

via:Hatena::Question

それに対しての回答が、、、

こちらのページはいかがでしょうか?

マウスの座標を取得する

http://www.openspc2.org/JavaScript/Ajax/Ajax_study/chapter05/013/index.html

via:Hatena::Question

リンクかい!!

リンク先をたどってみると、確かに回答が書いてありました。

window.onmousemove = getMouseXY;
function getMouseXY(evt)
{
x = evt.x;
y = evt.y;
document.getElementById("result1").innerHTML =
"(x,y) = "+x + ", "+y;
x = evt.pageX;
y = evt.pageY;
document.getElementById("result2").innerHTML =
"(pageX,pageY) = "+x + ", "+y;
x = evt.layerX;
y = evt.layerY;
document.getElementById("result3").innerHTML =
"(layerX,layerY) = "+x + ", "+y;
x = evt.clientX;
y = evt.clientY;
document.getElementById("result4").innerHTML =
"(clientX,clientY) = "+x + ", "+y;
x = evt.screenX;
y = evt.screenY;
document.getElementById("result5").innerHTML =
"(screenX,screenY) = "+x + ", "+y;
x = window.pageXOffset;
y = window.pageYOffset;
document.getElementById("result6").innerHTML =
"(pageXOffset,pageYOffset) = "+x + ", "+y;
}

via:マウスの座標を取得する

確かにこれをコピペして実行したら各種座標を取得することができたのですが、すっげー気になるポイントが一箇所あって、

window.onmousemove = getMouseXY;
function getMouseXY(evt)

この時の、evtって実際にどんな値が入ってくるのか??

これがどうしてもわかりません。

例えば、

onclick="hoge(3)"

onChange = "foo('uhehehe')"

などはわかりますが。

うーん、ちょい困っております。

2010/03/10

[html 5]canvasタグの対応状況について

タイトル通りに、html 5からサポートされるcanvasタグについての各ブラウザのサポート状況が気になったので調べてみると、

IT-Walker on hatenaさんの
HTML5のcanvas2dの実装状況も調べてみた
にきちんと掲載されていました。(すごく便利)

さらに他のタグについてのサポート状況は、
最新ブラウザのHTML5タグへの対応状況をまとめてみた
に掲載されています。

是非、ご参照ください。

2010/03/09

[クロノトリガー]トムさんからサインいただきました!!

じゃーん。

Photobucket

実は、この前、ビィノスやまざきで知り合ったスクエア・エニックスのトムさんから頂いたサイン。

トムさんは、ゲームソフトの言語を日本語から英語に翻訳をしている仕事に携わっていて、今までに携わった作品を聞いたら、もう名作ばかり。

ファイナル・ファンタジーシリーズ
クロノトリガー
と名作ばかり。

海外にゲームをリリースするには、当然、日本語ではダメなわけで、そこでトムさんのチームが英語に言語を訳すわけですな。

子供のころからスクエア・エニックスのゲームソフトで育ってきたので、お会いしたときは、超感動しました。

さらに驚いたのは、同じ年なんですね!!

同じ年なのにこうも仕事のレベルが違うとは。

もっと精進しないとなーっとつくづく感心。

余談ですが、トムさんから聞いたのですが、海外では、ドラクエよりファイナルファンタジーの方が人気があるみたいです。


2010/03/08

[PHP][JavaScript]ajaxでcanvasタグのデータを送信した際に、imagecreatefromstringがエラーになってしまう件

理由がよくわからないのですが、ajaxでcanvasタグのイメージデータの送信を行い、サーバーサイドでimagecreatefromstringを使うとなぜかエラーになってしまいます。


data = "paintdata=canvasタグのイメージデータ";
var httpObj = new XMLHttpRequest();
/* リクエストの状態が変更されたときに無名関数が呼び出される */
httpObj.onreadystatechange = function(){
/* 解析結果を取得する変数 */
var retText ;
/* リクエストの状態が完了した時 */
if(httpObj.readyState == 4){
/* ステータスコードを調べ200の場合ならOK、
それ以外の場合はエラーとする */
if(httpObj.status == 200){
/* textを取得する */
retText = httpObj.responseText;
/* 関数にtextを入れる */
lf_Ret(retText);
}else{
/* 関数にエラーを入れる */
lf_Ret("var ret = '';ret=false;");
}
}
};
/* openメソッドを設定する */
httpObj.open(
"POST"
, "送信先のファイル.php"
, true
);
httpObj.setRequestHeader(
"content-type"
, "application/x-www-form-urlencoded;charset=UTF-8"
);
httpObj.send(data);

//送信先のphp処理

$paintdata = $_POST["paintdata"];
//画像作成処理
$paintdata = base64_decode($paintdata);

//↓エラー発生ポイント
$im = imagecreatefromstring($paintdata);

普通にsubmitするとうまくいくんだけどなー。