2010年05月17日

引っ越しました

Googleに引っ越しました。

http://it-virtuoso.blogspot.com/  
Posted by 中垣健志 at 22:12Comments(107)TrackBack(0)

2010年04月18日

Joomla1.5+さくらレンタルサーバでフレンドリーURL

Joomla 1.5を使うと、ディレクトリを分けて複数のサイトを管理する事ができる。また、"http://www.foo.bar.com/info"といったユーザーフレンドリーなURLを使う事ができる。これを組み合わせてさくらのレンタルサーバで使うにあたって少し苦労したので、ここに備忘録として記しておく。

・Joomlaの設定
http://foo.domainname.com/としたい場合は、インストール場所は、~/www/fooにする。http://www.domainname.com/としたい場合は、インストール場所は~/www/wwwにする。ただしwwwのみの単一運用であれば、~/wwwにする。
管理画面から、基本設定−サイトに移動する。
SEOの設定で「サーチエンジンフレンドリーURL=はい」「Apache mod_rewriteを利用=はい」「サフィックスをURLに追加=いいえ」二設定する。

・さくらのサーバ側の設定
もし、wwwで始まらないドメインを使いたい場合には、ドメイン設定でドメインを追加する。このドメインは標準のドメインではなく、別途取得したオリジナルドメインである必要がある。さらに、サブドメインの指定も行っておく。
Joomlaをインストールしたディレクトリに存在するhtaccess.txtを.htaccessに変更する
.htaccessの中身について「Options +FollowSymLinks」と「RewriteBase /」のコメントを削除する  
Posted by 中垣健志 at 22:56Comments(808)TrackBack(0)Joomla

2010年03月31日

web2py & GAEによるデモ on youtube2

前のブログの動画の続きです。
これらの動画は、Python & Ruby東海での発表内容を動画で再構築したものです。

  
タグ :web2py
Posted by 中垣健志 at 06:20Comments(350)TrackBack(0)GAE

2010年03月29日

web2py & GAEによるデモ on youtube

0からweb2pyを使ってGoogle App Engineのアプリを作る方法を作成しました。見てね。

  
タグ :web2py
Posted by 中垣健志 at 06:15Comments(89)TrackBack(0)GAE

2010年03月16日

40秒で作るweb2pyアプリ

■[Python]40秒で作るweb2pyアプリ
web2pyもRailsには負けていません。何せ後発ですから。
「何かメモするアプリ」ということで作ってみます。環境はこんな感じです。

$ python web2py
web2py Enterprise Web Framework
Created by Massimo Di Pierro, Copyright 2007-2010
Version 1.76.5 (2010-03-11 15:19:08)
Database drivers available: SQLite3
Starting hardcron...
というわけで、つくるよ!

アプリケーション作成
管理サイト上で、アプリケーションを作ります。


モデル生成

モデルはソースコード(db.py)で定義します。
db.define_table('note',
  Field('body', 'text')
)

コントローラーの作成

データの入力と表示を行うコントローラーを作成します。
def index():
  form = SQLFORM(db.note)
  if form.accepts(request.vars):
    redirect(URL(r=request))
  notes = db().select(db.note.ALL)
  return dict(form=form, notes=notes)

はい、これで完成。

ブラウザで確認
ブラウザで確認します。
http://localhost:8000/mynote/
出ました!




web2pyも簡単だよ。  
Posted by 中垣健志 at 23:07Comments(614)TrackBack(0)web2py

2010年03月15日

WHR-G300Nで接続がよく切れる

バッファロー社のWHR-G300Nを使っていて接続がぶちぶち切れてしまう時は、無線設定のWPS機能をオフにすると調子が良くなるようです。危うく新しい無線ルーターを買ってしまうところだった。  
Posted by 中垣健志 at 18:00Comments(929)TrackBack(0)

2010年03月13日

GAE, Snow Leopard, python

ついさっき知りましたが、GAEはpython2.5が推奨環境です。しかーし、Mac OS X Snow Leopardはデフォルトがpython2.6となっています。そのためweb2pyのアプリを乗っけるとエラーが頻発します。しかもそれらがweb2pyのエラーチケットとしてフックされ、しかもそれを見るためのGAEが立ち上がらないという堂々巡り。

仕方がないのでしばらくは、Launcherを使用せずにコマンドラインからGAEを起動するようにします。
$ /usr/local/bin/dev_appserver.py web2py
  
タグ :web2py
Posted by 中垣健志 at 13:14Comments(113)TrackBack(0)GAE

2010年03月13日

GAEの開発環境にweb2pyをデプロイできない

web2pyで作ったアプリをGAEで作っているけど、うまく行っていない。
とりあえず現状をさらして、他力本願。

OS : Mac OS X 10.6
python : Version 2.5.x
web2py : Version 1.76.5
GAE : Version 1.3.1

$ /usr/local/bin/dev_appserver.py web2py
/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/appcfg.py:41: DeprecationWarning: the sha module is deprecated; use the hashlib module instead
import sha
/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver_login.py:33: DeprecationWarning: the md5 module is deprecated; use hashlib instead
import md5
Traceback (most recent call last):
File "/usr/local/bin/dev_appserver.py", line 68, in
run_file(__file__, globals())
File "/usr/local/bin/dev_appserver.py", line 64, in run_file
execfile(script_path, globals_)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver_main.py", line 417, in
sys.exit(main(sys.argv))
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver_main.py", line 360, in main
config, matcher = dev_appserver.LoadAppConfig(root_path, {})
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 3444, in LoadAppConfig
raise AppConfigNotFoundError
google.appengine.tools.dev_appserver.AppConfigNotFoundError
  続きを読む
タグ :web2py
Posted by 中垣健志 at 12:39Comments(968)TrackBack(0)GAE

2010年03月01日

メール本文をPDFに変換するアプリ

Google App Engineでメール本文をPDFに変換するアプリを作成しました。
味も素っ気もないWebページはこちら。
http://nakakenstudy.appspot.com/
このページは本質的には全然関係なくて利用に当たっては、mail2pdf@nakakenstudy.appspotmail.comまでメールを送ってください。メールの本文がPDFとなって返信されます。
PDFの変換を試すには、http://nakakenstudy.appspot.com/post2pdf をリクエストしてください。

今回はreportlabを使ってテキストをPDFに変換しました。といってもベタにテキストにするだけなので、ほとんど実装していません。あんまり短くできたので、記念にソース公開しておきます。うるさい事言わないので、勝手にコピペしてください。blogの制約上全角スペースでインデントをつけているので、各自で半角スペースに変換しておいてください。

# -*- coding: utf-8 -*-
#!/usr/bin/env python
#
# Copyright 2007 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

import logging
import StringIO

import pdf

from email.utils import parseaddr
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from google.appengine.ext.webapp.mail_handlers import *

SENDER_ADDRESS = 'nakaken@mediacat.ne.jp'

def main():
 application = webapp.WSGIApplication([
    (r'/', MainHandler),
    (r'/_ah/mail/.+', Mail2PdfHandler),
    (r'/post2pdf', Post2PdfHandler),
 ], debug=True)
 util.run_wsgi_app(application)

def goodDecode(encodedPayload):
 encoding = encodedPayload.encoding
 payload = encodedPayload.payload
 logging.debug(encoding)
 logging.debug(payload)
 if encoding and encoding.lower() != '7bit':
  payload = payload.decode(encoding)
 else:
  try:
   payload = payload.decode('ISO-2022-JP')
  except Exception, value:
   logging.warn(value)
 return payload

class MainHandler(webapp.RequestHandler):
 def get(self):
  self.response.out.write('Mail to "mail2pdf at nakakenstudy.appspotmail.com" and you can get pdf file converted from your mail.')
 
class Mail2PdfHandler(InboundMailHandler):
 def receive(self, message):
  logging.info('do Mail2PdfHandler.receive')
  
  editormail = parseaddr(message.to)[1]
  account = editormail.split('@')[0]
  if account != 'mail2pdf':
   logging.warn(account + ' is an undefined account.')
   return
  
  content = ''
  for body in message.bodies(content_type='text/plain'):
   content += goodDecode(body[1])
  logging.debug(content)
  
  buffer = StringIO.StringIO()
  pdf.go(buffer, content)
  pdffile = buffer.getvalue()
  buffer.close()
  
  logging.info('sender=' + SENDER_ADDRESS)
  logging.info('to=' + message.sender)
  mail.send_mail(
   sender=SENDER_ADDRESS,
   to=message.sender,
   subject='result of converted pdf from mail',
   body='Here is the pdf file you want, yeah!',
   attachments=[('content.pdf', pdffile)],
  )

class Post2PdfHandler(webapp.RequestHandler):
 def get(self):
  self.response.headers['Content-Type'] = 'text/html'
  self.response.out.write("""<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
 <form action="/post2pdf" method="post">
  <p>PDFに変換したい文字列を入力してください</p>
  <textarea cols="60" rows="30" name="content"></textarea><br />
  <input type="submit" value="変換" />
 </form>
</body>
</html>"""
)

 def post(self):
  content = self.request.get('content')
  buffer = self.response.out
  pdf.go(buffer, content)
  self.response.headers['Content-Type'] = 'application/pdf'
  
if __name__ == '__main__':
 main()

[[ pdf.py ]]
# -*- coding: utf-8 -*-
import cgi
import StringIO

from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfbase import pdfmetrics
from reportlab.platypus import SimpleDocTemplate, Spacer, XPreformatted
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.rl_config import defaultPageSize
from reportlab.lib.units import inch

pdfmetrics.registerFont(TTFont('Togoshi-mono', 'togoshi-mono.ttf'))

PAGE_HEIGHT=defaultPageSize[1]
PAGE_WIDTH=defaultPageSize[0]

styles = getSampleStyleSheet()
my_style = styles["Normal"]
my_style.name = "bonlife"
my_style.fontName = "Togoshi-mono"
my_style.fontSize = 0.15*inch
my_style.leading = 11

def go(filename, content):
  doc = SimpleDocTemplate(filename)
  Story = [Spacer(1, 0.5*inch)]
  style = my_style
  
  x = XPreformatted(cgi.escape(content), style)
  Story.append(x)
  
  doc.build(Story)
  
Posted by 中垣健志 at 22:43Comments(497)TrackBack(0)GAE

2010年02月14日

Joom!fishで翻訳文書が表示されない

Joom!fishは、サイトを他言語化するに、すばらしいソリューションを提供してくれるが、ちょっと動きが怪しいところがあった。完全に正しいかどうかわからないけれども、実際にあった事をかいておきます。

#1 保存し直したら表示された
Joom!fishで登録した翻訳文が、blogスタイルのページで表示できなかった。翻訳文を消して、もう一度登録し直したら表示された。

#2 アンケートが翻訳されなかった
コンポーネント「アンケート」で作成したアンケートが、メニュー内でだけ選択肢が翻訳されなかった。modules/mod_poll/helper.phpをハックする必要があるらしい。

$query = 'SELECT p.id, p.text' .
' FROM #__poll_data as p' .
' WHERE p.pollid = ' . (int) $id .
' AND p.text <> ""' .
' ORDER BY p.id';

単に、テーブル名のエイリアスを入れただけなんだけど、うまく動いた。
http://forum.joomla.org/viewtopic.php?p=2016608
  
Posted by 中垣健志 at 14:49Comments(934)TrackBack(0)Joomla

2010年01月31日

無線LANのチャンネルを調べる

どうも無線LANの調子が悪いので、チャンネルを固定化する事にしてみた。
その場合、近くで使われていないチャンネルを探さないといけないのだけれど、それをmac(snow lepard)で調べるにはどうすれば良いかと思ったらコマンドラインでできる事がわかった。

$ cd /System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/
$ ./airport -s

詳しい人たちがいるものだ、と感心。
http://blog.isocchi.com/2009/04/java-jamac-maclan.html
  
Posted by 中垣健志 at 15:41Comments(172)TrackBack(0)mac

2010年01月16日

Joomla1.5サイトを構築する #2

とりあえず日本語化が完了したら、次は見た目を整える。Joomlaはとても使いやすいCMSで、いつでもテンプレートを変更する事が可能だ。だがしかし、色合いの違うテンプレートに差し替えると、思った通りのサイトにはならない。やる気を出すためにも、はじめの段階でテンプレートを最終版に決定するべきだ。

テンプレートは、とりあえず以下のサイトから見つけるのがよい。とにかく数が多いのでだんだん大変になってくるが、根気よく作成するサイトにマッチするものを見つけよう。
http://www.joomla24.com/

気に入ったテンプレートを見つけたら、管理サイトからテンプレートを次の手順でインストールする。管理サイトも日本語化がされている前提でメニューなどは表記している。
1. メニューから「エクステンション - インストール/アンインストール」を選択する。
2. パッケージファイルのアップロードに、ダウンロードしたテンプレートのzipファイルを選択してインストールボタンを押す。あるいは、URLからインストールにテンプレートをダウンロードしたときに使ったURLを指定したインストールボタンを押す(joomla24のサイトは、一番最初に手作業でdownloadを行わないと、zipファイルをダウンロードするためのURLが使えない仕様になっているので注意)。
3. メニューから「エクステンション - テンプレート管理」を選択する。
4. 適用したいテンプレートのラジオボタンを選択して、デフォルトボタン(星形のアイコン)をクリックする。

これでよい。
テンプレート内のタイトル画像などは、サーバ内のファイルを直接置き換える事で差し替え可能だ。しかしサイズを変えるとレイアウトが崩れる事が多いので、元々の画像とサイズは合わせるのが吉である。
  
Posted by 中垣健志 at 16:57Comments(429)TrackBack(0)Joomla

2010年01月16日

Joomla1.5サイトを構築する #1

Joomlaをインストールして、サンプルデータベースで遊んで、さて空の状態から自分のサイトを作ろうかと思ってはいるが、どこから手を付けてよいのやら迷ってしまった、そんな自分のためのJoomla備忘録。

日本人なら、まずはじめにしなければならない事は、サイトの日本語化ではないだろうか。
これは次のように行う。

1. 管理サイトにログインする。
2. メニューから「Extension - Install/Uninstall」を選択する。
3. 「URLからインストール」の欄に、サイト用と管理サイト用のランゲージパックをそれぞれ選択してInstallボタンを押す
4. メニューから「Extension - Language Manager」を選択する。
5. SiteとAdministratorのそれぞれについて、Japaneseのラジオボタンを選択し、デフォルトボタン(星のアイコン)をクリックする

これで完了。管理サイトが日本語化されるはず。
通常のサイトは、この設定によって日本語化されたかどうかはわからない(ログインモジュールなどを表示すると、日本語化されているのがわかる)

ちなみにランゲージパックは、以下のサイトからダウンロードできる。
Joomla! Accredited Translations Project(http://joomlacode.org/gf/project/jtranslation/)
メニューから「ファイル」を選択して、日本語関係のファイルを探してほしい。Joomla1.5.10の場合は
・ja-JP_Joomla_1.5.15_site.zip
・ja-JP_Joomla_1.5.15_admin.zip
の二つだ。
  
Posted by 中垣健志 at 08:44Comments(101)TrackBack(0)Joomla

2010年01月13日

MACからさくらのサーバーにSSHで接続する方法

ターミナルを開き、次のコマンドを入力する。

>ssh -l ユーザー名 サーバーパスワード
  
Posted by 中垣健志 at 11:23Comments(445)TrackBack(0)さくら

2009年11月02日

無料素材

「写メ de 新聞」サービスを作るにあたって、利用した無料のサービスを紹介します。
これがなければ、もっとしょぼいデザインになるところでした。

「携帯サイト簡単構築」携帯サイトのテンプレート
携帯サイトを作るのは初めてだったので、通常のPCブラウザ用のHTMLとはいろいろな面で異なる事が多いです。携帯サイト用のテンプレートもいろいろ世の中に存在しているのですが、ここのテンプレートはシンプルなのと三つのキャリアで共通で使えるところが気に入りました。
http://web.rejec.net/

「Open Source Web Design」PCサイトのテンプレート
アメリカのサイトですが、そのまま使えるクールなテンプレートが2,000個以上も用意されています。ぱらぱらとたどっていけば、きっと気に入るテンプレートが見つかります。今回は割とシンプルなテンプレートを入手しました。中身のHTMLが想像以上にシンプルだったので、動的コンテンツを利用するサイトでも大変使いやすいです。
http://www.oswd.org/

「Interspire」ロゴのデザイン
いろんなテンプレートがあるようですが、Resouces - Website Templatesを選択して、さらにLogo Designsを選択すると、かっこいいアイコン付きのロゴデザインが用意されています。ロゴの文字は入っていないですが、Illustratorファイルとしてダウンロードできます。Illustrator(自分のように貧乏な人はInkscape)を用意すれば、文字を編集する事ができます。なかなかおすすめです。
http://www.interspire.com/

「FavIcon from Pics」favicon画像の作成
faviconとは、ブラウザのアドレスバーの左側やブックマークの一覧などで使われる、ちっちゃな画像です。意外と作るためにはツールなどが必要で、かつそれはWindows用が多いのでにわかマカーは一苦労です。それでもこのサイトを使えば、大きめの画像をアップロードするだけでちっちゃなfaviconを返してくれます。
http://www.html-kit.com/favicon/
  
Posted by 中垣健志 at 20:25Comments(179)TrackBack(0)デザイン

2009年11月02日

α版公開

初めてのPython & Google App Engineで作成したアプリを、ようやく公開しました。
とにかく世に出して、意見を問おうかと考えています。

「写メ de 新聞」
http://shamedeshimbun.appspot.com/pc/

「写メ de 新聞」は、写メールを使って新聞を作れるサービスです。 記事の投稿はとても簡単。携帯で撮った写真に記事をつけて、あらかじめ用意されたアドレスに写メールで送るだけです。 送った写メールは、速報としてすぐに携帯やPC上で配信されます。 一通り記事がそろったら、PDFでまるで本物のような新聞を作成する事もできます(作成予定)

仲間内でのゴルフコンペや旅行などみんなが集まるときは、「写メ de 新聞」でみんなの新聞を作ってください!  
Posted by 中垣健志 at 16:35Comments(326)TrackBack(0)写メ de 新聞

2009年11月01日

捕捉仕切れなかった実行時例外をログに出力する

RequestHandlerは、実行例外が処理されなかった時に、最後にexception_handlerメソッドを実行する。
ここに、例外の情報を出力するロジックと、共通のエラー画面を表示するロジックを記述するとよい。
例外の情報は、traceback.format_exc()を使うと簡単だ。

# importは省略

class BaseRequestHandler(webapp.RequestHandler):
def handle_exception(self, exception, debug_mode):
logging.error(traceback.format_exc())
self.response.out.write('エラーが発生しました')
  
Posted by 中垣健志 at 18:44Comments(66)TrackBack(0)GAE

2009年10月27日

メールに添付されているファイルを取得する

ちょい苦労したけど、これで行けそう。

class MailHandler(InboundEmailHandler):
def receive(self, message):
attachment = message.attachments # ここ注意
binarydata = message.[1].payload.decode(message[1].encode)

でもこれは、添付ファイルが一つの場合のみ。
添付ファイルが一つの時は、message.attachmentsはtupleで(添付ファイル名, EncodePayloadオブジェクト)
となっている。
添付ファイルが二つの時は、message.attachmentsはlistで、[(添付ファイル名, EncodePayloadオブジェクト), (...)]となっている。
さらに添付ファイルがない時には、messageにattachmentsがそもそも存在しない。
それも踏まえて、場合分けをする必要があるようだ。

http://groups.google.com/group/google-appengine/browse_thread/thread/8bf0ab058eb3fcb3/dc447ee56ef59890?lnk=raot  
Posted by 中垣健志 at 21:43Comments(387)TrackBack(0)GAE

2009年10月25日

GAEで受信したメールの件名を取得する

これでいけるようだ。

class MailHandler(InboundEmailHandler):
def receive(self, message):
header = decode_header(message.subject)
subject = ''
for s, charset in header:
if charset:
subject += unicode(s, charset)
else:
subject += s

無条件でunicode(s, charset)とやってしまうと、件名が英語だけの時にcharsetがNoneになる事があるので注意しよう。  
Posted by 中垣健志 at 17:36Comments(72)TrackBack(0)GAE

2009年10月25日

Google App Engineでメール受信できた人いる?

Google App Engine 1.2.6からメールを受信する機能が追加された。
これは便利だと早速試してみたけれども、なかなかうまく行かない。
ネットで調べてみても、「できるようになったらしいよ」とGoogleやGIGAZINEのニュースを引く人はいるけれども、実際に受信したとかあるいはいろいろトラブったという話は、ヒットしない。Googleのサイトも英語は説明あるけど日本語の説明がないのもちと怪しい。

とにかく、今の事象を書いておくとする。だれか助けて。

[開発サーバでの話]
app.yamlに以下の設定をする。

- url: /_ah/mail/.+
script: main.py
login: admin

そして管理コンソールからメールを送ると、次のメッセージが出る。
Message send failure
Current logged in user is not authorized to view this page

まあ、(login:adminとしているので)そりゃそうなんだけど、じゃあどうしろと?


[本番サーバでの話]
駄目もとでデプロイして、regist@appid.appspotmail.com宛にメールを送ると、こんなつれない返事が返ってくる。
(ちなみにappidは、"http://appid.appspot.com/"のappidと合わせてあります)

This is an automatically generated Delivery Status Notification

Delivery to the following recipient failed permanently:

regist@appid.appspotmail.com

----- Original message -----
(以下略)

  続きを読む
Posted by 中垣健志 at 13:06Comments(77)TrackBack(0)GAE