月別アーカイブ: 7月 2013

WordPressのメール送信フォーム Contact Form7のカスタマイズ

WordPressのメール送信フォームのカスタマイズで有名なContact Form7は有名ですが、このカスタマイズにはしばらく手を出していなかった。

今回必要となる要件としてWordPressのユーザ(WPをつまり会員サイト用につくる)した時にメール送信フォームを
用意する場合、どうやってユーザ名とメールアドレスを自動で入れるかが課題だった。既に会員登録しているから入力させるのは
重複なわけだ。

検索したところ、ようやくContact Form7でそれがサポートされていることがわかった。
このサイトが役に立ちました。


ログインフォームの自動化(本家サイト)

ちなみに、下記も一緒に読むとベスト
[WordPress] ユーザー情報を取得する
特別なメールタグ

インストール: 久しぶりにRED5ストリーミングサーバ 構築

以前のサイトでは、RED5で作るストリーミングサーバの記事が大変人気だったため、このサイトに変えて無くなってしまったため、困っている人が多いようだ。

ということで少し記事を復活させよう。

# 適当なフォルダーつくってRED5ダウンロード
# wget http://red5.org/downloads/red5/1_0/red5-1.0.0-RC2.tar.gz

# tar xvfz red5-1.0.0-RC2.tar.gz

# ls
red5-1.0.0 red5-1.0.0-RC2.tar.gz

# cd red5-1.0.0

ファイルは以下のようになっている
# ls -l
合計 2036
-rw-r–r– 1 root games 409 5月 17 01:36 2012 Makefile
-rw-r–r– 1 root root 36864 7月 25 01:16 2013 admin.h2.db
-rw-r–r– 1 root games 16493 5月 17 01:36 2012 boot.jar
-rw-r–r– 1 root games 1850 5月 17 01:36 2012 build.properties
-rw-r–r– 1 root games 45769 5月 17 01:36 2012 build.xml
drwxr-xr-x 3 root games 4096 7月 14 09:16 2013 conf
drwxr-xr-x 8 root games 4096 5月 17 01:36 2012 doc
drwxr-xr-x 2 root games 4096 5月 17 01:36 2012 lib
-rw-r–r– 1 root games 1284 5月 17 01:36 2012 license.txt
drwxr-xr-x 2 root games 4096 7月 25 01:06 2013 log
drwxr-xr-x 2 root games 4096 5月 17 01:36 2012 plugins
-rw-r–r– 1 root games 168 5月 17 01:37 2012 red5-debug.bat
-rwxr-xr-x 1 root games 220 5月 17 01:37 2012 red5-debug.sh
-rw-r–r– 1 root games 1181 5月 17 01:37 2012 red5-highperf.bat
-rwxr-xr-x 1 root games 417 5月 17 01:37 2012 red5-highperf.sh
-rw-r–r– 1 root games 308 5月 17 01:37 2012 red5-shutdown.bat
-rwxr-xr-x 1 root games 344 5月 17 01:37 2012 red5-shutdown.sh
-rw-r–r– 1 root games 1110 5月 17 01:37 2012 red5.bat
-rw-r–r– 1 root games 963323 5月 17 01:37 2012 red5.jar
-rwxr-xr-x 1 root games 1297 5月 17 01:37 2012 red5.sh
-rw-r–r– 1 root games 930294 5月 17 01:37 2012 src.zip
drwxr-xr-x 8 root games 4096 7月 14 09:20 2013 webapps
drwxr-xr-x 3 root root 4096 7月 14 09:09 2013 work

起動はすごい簡単次のファイルを起動するだけ。
# ./red5.sh &

もし、Javaを導入していなければダウウロードしていれましょう。
http://docs.oracle.com/javase/7/docs/webnotes/install/linux/linux-jdk.html
JDK 7導入方法は省略。

今回は擬似ストリーミングではなくて本物のRTMPプロトコルのストリーミングです。

ストリーミング実現には大きく3種類あり、以下のような感じです。

  • ダウンロード型 (世間一般のWEBサーバに配置するタイプ)
  • 擬似ストリーミング型 (Youtube, GYAO)
  • ストリーミング型 (USTREAM)

違いがわからないと思いますが、ダウンロード型は設備もソフトも特にいらないコンテンツ記述だけでいける方式ですが
閲覧者のブラウザにファイルすべてダウンロードしてから再生するので時間がかかります。またスライダーを動かしても
タイムゲージ(早送り)うごきません。最初から再生して行かないとダメなんです。あと同時にVIDEOダウンロードする人が多いと
サーバがダウンします。精々同時アクセス10人くらいかな。再生はオンデマンドになります。

擬似ストリーミングは、従来のダウンロード型を改善したもので、ダウンロードをちょろちょろ行いながら再生します。スライダー
も動画に予めポジショニングのタグを埋め込むと早送りが可能です。サーバはApache,Lighthttpdなどで行います。これも再生は
オンデマンドになります。同時アクセス20人から50人くらいまでならOK。後はサーバ構築の腕次第でもっといきます。

ストリーミングはリアルタイム録画&再生、オンデマンドをこなす方式です。パケットを逐次ちょろちょろ転送するので沢山の
同時閲覧者をさばく事ができます。100人から500人は余裕かな。

では、次に設定ファイルをいじります。

# vi conf/red5.properties
# RTMP
rtmp.host=192.168.1.150 rtmp.port=1935 <—運用ポートなんでも結構
rtmp.io_threads=16
rtmp.send_buffer_size=271360
rtmp.receive_buffer_size=65536
rtmp.ping_interval=1000
rtmp.max_inactivity=60000
rtmp.max_handshake_time=5000
rtmp.tcp_nodelay=true
rtmp.default_server_bandwidth=10000000
rtmp.default_client_bandwidth=10000000
rtmp.client_bandwidth_limit_type=2
rtmp.bandwidth_detection=true
rtmp.encoder_base_tolerance=5000
rtmp.encoder_drop_live_future=false

VIDEOコンテンツを配置します. flv形式、mp4形式が使えます。
HandBrakeというオープンソースで変換や調整を行ってください。
変換がおわったら、FTP等でアップロードを下記パスへ行います。
# pwd
/opt/red5/red5-1.0.0/webapps/vod/streams
[root@site-wild streams]# ls -la
astro.mp4 street_of_fire.flv street_of_fire.flv.meta

これで準備は整いました。
red5のTOPへ戻り起動します。
# ./red5.sh &

すごい簡単でしょう!

ただね。コンテンツはデリバリー状態に成っているけども、コンテンツの書き方がわからないと提供していないも同然です。
適当なWEBサーバのドキュメントフォルダに再生用のコンテンツを配置して、VIDEOデリバリーできるようにします。

RTMPの再生パスは
このじょうたいでは “rtmp://xxxxxxx.com/vod”と成っています。

JW Playerという有名な無料の埋め込み式Flash Video Playerがあります。これを使います。
このPlayerは擬似ストリーミングとストリーミングの両方に対応しています。
http://www.longtailvideo.com/

以下埋め込みのサンプルコードです。

JW PLAYER (JW Player OLD Player)

<div id="preview" style="float:left;">
Street Of Fire Movie Trailer 1984
</div>

<script type='text/javascript'>
var s1 = new SWFObject('../player-viral.swf','ply','470','320','9','#ffffff');
s1.addParam('allowfullscreen','true');
s1.addParam('allowscriptaccess','always');
s1.addParam('wmode','opaque');
s1.addVariable('id','ply');
s1.addVariable('backcolor','3333FF');
s1.addVariable('lightcolor','00CC00');
s1.addVariable('screencolor','99FFFF');
s1.addVariable('icons','false');
s1.addVariable('dock','true');
s1.addVariable('displayclick','fullscreen');
s1.addVariable('file', 'street_of_fire.flv');
s1.addVariable('streamer', 'rtmp://xxxxxxxx.com/vod');
s1.addVariable('type', 'rtmp');
s1.write('preview');
</script>

JW PLAYER HTML5 fallback flash(JW Player New Player)

<div id='my-video'></div>
<script type='text/javascript'>
    jwplayer('my-video').setup({
        file: 'rtmp://yourserver/vod/spygame.mp4',
        width: '470',
        height: '320'
    });
</script>

fladance player

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0" width="470" height="320" id="ASTRO BOY">
	<param name="flashvars" value="fms_app=rtmp://xxxxxxxx.com/vod/&video_file=michael_say.flv&image_file=&link_url=&autoplay=false&mute=false&vol=&controllbar=true&buffertime=10" />
	<param name="allowfullscreen" value="true" />
	<param name="movie" value="./fladance.swf" />
	<embed src="./fladance.swf" width="470" height="320" name="ASTRO BOY" allowfullscreen="true" flashvars="fms_app=rtmp://html5.spazo.jp/vod/&video_file=michael_say.flv&image_file=&link_url=&autoplay=false&mute=false&vol=&controllbar=true&buffertime=10" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>

PythonでFeedを取ろう!

PythonでWEB作るなら、もちろんFeedを引っ張ることでしょう。NEWSとかTOPICSとか
ということで必要最低限の情報を取り出すコードを下記へペースト。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import feedparser
import time

fd = feedparser.parse('FEED URIパス')

#サイト名を表示
print fd.feed.title

#記事タイトルとリンクURL、日付、概要を表示
for i in range(10):
  print fd.entries[i].title
  print fd.entries[i].link
  print fd.entries[i].published
  print fd.entries[i].summary

#最新記事の更新時間
updatetime = time.strftime('%Y/%m/%d %X',fd.entries[0].published_parsed)
print updatetime

PythonでSEO調査(検索順位)

SEOをやっていると、自分のサイトの順位はどのへんなんだろう?って思いますよね。

気になるけど、最近のSEOツールは結構順位が不正確だったりします。Googleの変動が頻繁に行われているし、検索サーバが多いから同期がおいつかないのでしょう。

ということで今回はコマンドラインで、パパンと検索順位を調べる方法を掲載します。

もし、pipというツールをいれていないならこのページを参照してください(ここ CLICK)

標準でないモジュールで必要なのは2つだけ、インストールしておきます。

$ pip install google

$pip install BeautifulSoup

コードは以下の通リ。
自社のキーワードで100番以内に入っているか確認。TLDのco.jpはgoogle.co.jpの範囲で検索するという意味です。Lang=jaも日本語のサイトを対象に検索するという意味になります。後のパラメータはわかるよね!意外と便利だ!
正直言って顧客のサイトをさばくので手がいっぱいで自社のSEO全くしていない。。。(^_^;)でも33位くらいみたい。

$vi search.py

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
from google import search
from BeautifulSoup import BeautifulSoup
import urllib

#search data

words = "中小企業 WEBセキュリティ"
mysite = "www.netmarvs.com"
cnt = 1
for url in search( words ,tld='co.jp', lang='ja',start=1, stop=100):
    soup = BeautifulSoup(urllib.urlopen(url))
    if url.find(mysite) != -1:
           print str(cnt) + u"位" + url + "  " + soup.find('title').text
           sys.exit()
    cnt += 1

$ chmod 755 search.py
$ ./search.py

これなら、cronバッチファイルや自分のメールに定期的に送信も簡単出来ますな!

Gitでバージョン管理スタート。

いまや、バージョン管理といえばgitやhg(Mercurial)が主流ですが、意外とITの世界で私のように化石になりつつある輩は使ったことがない人が多い。ってゆうか、やってちゃだめよ。その歳でなんですが。会社経営していると、やる人がいなけりゃなんでもやらないといけなくなることもあるため、とりあえずGitやっちゃいます。

はい、色々とサイトを調べて読んでみるのだがいまいち手順がピンと来ない。自分的に的を得た説明のサイトが少なくイマイチ使い方がわからないい。結局理解するのに3時間もかかってしまった。

Gitはもともとcloneするのが専門だったので、バージョン管理はちっとも状態。

でローカルで管理するのはいいのだが、結局色々な環境で流用したりするからやっぱりリモートレポジトリは必要だ。

まず最初にリモートレポジトリのサイトをサインアップ。有名な所で無料といえばBitbuketでしょう。日本ではGitBreakあたりが無料。
ここであえてメジャーはさけて、Cloud Forgeを使ってみる。ここは無料で2GBまで使える。プロジェクト数は無制限。
利用の前提は非公開です。間違って公開しないので安心ですね。
普通にサインアップしてgitのレポジトリをとります。後は認証しながらPushするのでsshのパブリックキーを作りCloudForgeへ
登録しておきます。

以上の用意ができたら。今度は実際のサイトをリビジョン管理するためにGitを使います。

手順1)
リビジョン管理するフォルダに移動。
# git init

手順2)
リビジョン管理がないか確認。なければOK
$ git status

手順3)
リビジョン対象ファイルを全て登録(Stageの状態)
$ git add ./*

手順4)
一番最初のコミット(要するにローカルレポジトリへの登録。StageからHeadに移る)
$ git commit -m ‘initial commit my application’

手順5)
さっき取得したリモートレポジトリサーバのレポジトリ名をconfigに登録します。この時点ではまだリモートにアクションしません。
この作業自体は初回だけでよいので次回のコミットから不要です。
$ git remote add origin ssh://リモートレポジトリパス/project名.git

手順6)
この作業を行うとリモートレポジトリへPush(要するに差分を登録)します。
$ git push origin master

手順7)
最新バージョンを取り出して適当なディレクトリで使う場合はPullします。すなわちcloneすることがそれにあたります。
$ git clone ssh://localgit/home/git/test.git test

以上、こんなところです。

Google Page Speedでサイトの表示高速化

以前から知っていたけど、やっていなかったGoogle mod_pagespeedによるサイトの高速化。
噂通リの凄いやつ、ロード時間が1/3位に短縮されました。

CentOS5.8 とCentOS6.4で実験。結論はインストール手順には違いがなかった。

最初にyum-prioritiesをインストールします

[root@namhv src]# yum install yum-priorities

mod_pagespeed のYUM repositoryを追加

[root@namhv src]# vi /etc/yum.repos.d/mod-pagespeed.repo

CentOS 5.8 32 Bit or 6.4 32Bit  の場合

[root@namhv src]# vi /etc/yum.repos.d/mod-pagespeed.repo
[mod-pagespeed]
name=mod-pagespeed
baseurl=http://dl.google.com/linux/mod-pagespeed/rpm/stable/i386
enabled=1
gpgcheck=0

[root@namhv src]# chmod +x /etc/yum.repos.d/mod-pagespeed.repo
CentOS 5.5 64 Bit or 6.4 64Bit の場合

[root@namhv src]# vi /etc/yum.repos.d/mod-pagespeed.repo
[mod-pagespeed]
name=mod-pagespeed
baseurl=http://dl.google.com/linux/mod-pagespeed/rpm/stable/x86_64
enabled=1
gpgcheck=0

mod_pagespeedのパッケージ名を確認しましょう。
[root@namhv src]# yum list | grep mod-pagespeed

mod-pagespeed-beta.x86_64              1.6.29.4-3289                    mod-pagespeed
mod-pagespeed-stable.x86_64            1.4.26.3-3101                    mod-pagespeed

mod_pagespeedをインストールします。導入後にサーバを再起動すると有効になっています。

[root@namhv src]# yum install mod-pagespeed-stable

[root@namhv src]#service httpd restart

Turning the Module On and Off/On   <—-  これでGoogle pageSpeedのOn/Offします。

Google pageSpeedは/etc/httpd/conf/pegespeed.confの中に上記SWITCHがあるのでそこでOn/Offします。

Python WEBアプリをCGIで使う(後編:Part3)

今度はデータベースをSQL文なしで使うORマッパーを利用してデータベースを操作してみよう。
使うのはhttp://sqlobject.org/これはpythonの中でもなかなかわかりやすい
ORマッパーだと思います。CGIレベルで使うのであればこれで十分
Part1のプログラムを改造していじってみます。

まず最初に、MySQLでデータベースの器だけ用意しておきましょう。

[hidy@dev-mar01 py]$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12374
Server version: 5.1.69 Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql> create database test_db;
Query OK, 1 row affected (0.01 sec)

mysql> use test_db
Database changed
mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| mysql |
| pyramid_db |
| test_db |
+——————–+
21 rows in set (0.00 sec)

mysql>

この例ではtest_dbというデータベースを作成しました。
次に2つモジュールを導入しましょう。

$ pip install sqlobject
$ pip install MySQL-python

ソースコードを作成します。

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import string
import random
import hashlib
from sqlobject import *
import datetime

sqlhub.processConnection = connectionForURI("mysql://test:12345@localhost/test_db")

class WpUserSub(SQLObject):
    default = "CURRENT_TIMESTAMP"
    id_no = StringCol(length=6,notNone="yes",alternateID=True)
    pd_src = StringCol(length=64,notNone="yes",alternateID=True)
    enable = BoolCol(notNone="yes")
    created_at = TimestampCol()

class  Id_gen(object):
    def  __init__(self,stat):
       try:
            WpUserSub.createTable()
            self.__stat = stat
       except:
            self.__stat = stat

    def  inst(self):
       try:
           b = WpUserSub.select().max('id_no')
           b = int(b) + 1
       except:
           b = 1
       data = "%05d" % b
       pw = self.pw_gen(10)
       return {'id_no':data,'enable':self.__stat,'pd_src':pw}

    def  pw_gen(self,length):
       src = string.digits + string.letters
       s=''
       for i in range(1, length):
          s += random.choice("suhvq4v87wrnqweq3b234tb2vNN")
       s = hashlib.md5(s).hexdigest()
       return s

def main():
    p = Id_gen(1)
    print p.inst()['id_no']
    print p.inst()['enable']
    ins = WpUserSub(
        id_no = p.inst()['id_no'],
        pd_src = p.inst()['pd_src'],
        enable = p.inst()['enable'],
    )

if __name__  ==  '__main__':
    main()

導入が完了しましたら実行してみましょう。

# chmod 755 code01.py
# ./code01.py

データベースにアクセスしてテーブルができていればOK

$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12377
Server version: 5.1.69 Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql> use test_db
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+——————-+
| Tables_in_test_db |
+——————-+
| wp_user_sub |
+——————-+
1 row in set (0.00 sec)

mysql> desc wp_user_sub;
+————+————-+——+—–+——————-+—————————–+
| Field | Type | Null | Key | Default | Extra |
+————+————-+——+—–+——————-+—————————–+
| id | int(11) | NO | PRI | NULL | auto_increment |
| id_no | varchar(6) | NO | UNI | NULL | |
| pd_src | varchar(64) | NO | UNI | NULL | |
| enable | tinyint(1) | NO | | NULL | |
| created_at | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+————+————-+——+—–+——————-+—————————–+
5 rows in set (0.00 sec)

mysql> select * from wp_user_sub;
+—-+——-+———————————-+——–+———————+
| id | id_no | pd_src | enable | created_at |
+—-+——-+———————————-+——–+———————+
| 1 | 00001 | 6eddb71104751725f6d6894d4ddb030a | 1 | 2013-07-13 22:59:05 |
+—-+——-+———————————-+——–+———————+
1 row in set (0.00 sec)

mysql>

はい、自動的にデータベースのテーブルが作成されました。ついでにデータも1件入りましたね。
んー、便利。

Python WEBアプリをCGIで使う(後編:Part2)

今回は、Twitterのショートプログラムを作って見よう。

PythonでTwitterプログラムを作る時に便利なのがTweepy。
Twitter はREST API v1.0の頃と今は違って仕様が変わっています。巷にあふれているサンプルコードは動作しないものばかりです。動作するものはREST API v1.1に対応したtweepyが必要。
ところが、これがまた不完全で使えない機能が結構ある。

本家のtweepyが糞で使えない。一部対応しているが特に検索機能はだめ!
フォークしたtweepyを”sakito”さんが作ってるのでそれをインストールします。
https://bitbucket.org/sakito/tweepy/src/4e1704b3e391?at=default

Twitter検索の仕様)
https://dev.twitter.com/docs/api/1.1/get/search/tweets

Twitter application keyの取得)
ログインしてアプリケーション登録するとキーが取得出来ます。
https://dev.twitter.com/

hgを使ってローカルに取り込みます。まずはhgがないと話にならない。
# yum install python-devel
# easy_install -U mercurial
# hg clone https://bitbucket.org/sakito/tweepy
# cd tweepy
# python setup.py install

はい、これで使えるようなりました。

検索プログラムで特定のTweetを引っ張りましょう。

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import os.path
import tweepy2
import urllib

CONSUMER_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
CONSUMER_SECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
ACCESS_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
ACCESS_SECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

# Twitter の認証を行う
auth = tweepy2.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_KEY, ACCESS_SECRET)
api = tweepy2.API(auth)

def main():
# 検索
    query = u"犬" # クエリ
    results = api.search_tweets(urllib.quote_plus(query.encode('utf-8')))

    print "Content-Type: text/html;charset=utf-8"
    print
#    print "Content-Type: application/octeat-stream"
#    print ""
    print
    print
    print "<html>"
    print "<body>"

    for result in results:
         print str(result.created_at) + "<br>"
         print result.user["name"].encode('utf-8') + "<br>"
         print result.text.encode('utf-8') + "<br>"
         print "-----------------------------------------------------------------------------------------<br>"
    print "</body>"
    print "</html>"
    print ""

if __name__  ==  '__main__':
    main()

Python WEBアプリをCGIで使う(後編:Part1)

Pythonで作業を始める前にやっておきたいのが、デフォルトのエンコードセッティング。
かならずやっておきましょう。

プログラムからやるのではなく、環境設定として行うことで文字種別に関するエラーがコレで半減する。

インストールしているpython libraryのパスにある”site-packages”配下に作成する。
通常は/usr/lib/python2.6/site-packagesがCentOSのパスです。
# vi sitecustomize.py

import sys
sys.setdefaultencoding("utf-8")

プログラムから設定するdefaultencodingの設定もあるが、呼び出しモジュール側のことも考えるとエラーに成ってしまうことも度々。だからこの設定をしておくと全体でデフォルト文字コードを設定してくれる。

それでは、必要最低限のブラウザへ表示させる簡単なコードを書いてみましょう。WEBサーバの設定は前の記事を参考にしてください。
ブラウザへ出力するには、どの言語でも共通ですがこの2行を忘れずに

print "Content-Type: text/html;charset=utf-8"
print

以下のプログラムはIDとパスワードをブラウザ上へ出力する簡単なプログラムです。例えばワードプレスで会員サイトを作ろうと思った時にIDとパスワードを大量にまとめて発行したいときなど手作業でやったら大変です。ということでそのベースとなるサンプルプログラムです。
IDは何回やっても同じですが、ここはDBにあるシーケンシャルIDの最大値を求めて最終的に作り変えればよいでしょう。PDは毎回乱数で作成しMD5で暗号化していますのでWPのユーザテーブルに直接書き込んで使えば、もちろん問題なく使えます。

仕様:
クラス IdInf_gen にIDの長さとPDの長さを指定してIDとPDを得るプログラム。
コンソールで実行しても、ブラウザで実行しても動作するプログラムです。必ず最後はアクセス権を実行権限をつけましょう。

# vi disp.py

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import string
import random
import hashlib
import datetime

#ログイン名のダミー情報
base_code ="G"
b = 1

class  IdInf_gen(object):
    def  __init__(self,len=5,pw_len=10):
       self.__len  = len
       self.__pw_len = pw_len

    def  inst(self):
       fm = "%0" + str(self.__len) + "d"
       data = fm % b
       data = base_code + data
       pw = self.pw_gen()
       return {'id':data,'pw':pw[0],'pw_org':pw[1]}

    def  pw_gen(self):
       length = self.__pw_len
       src = string.digits + string.letters
       s=''
       for i in range(1, length):
          s += random.choice("suhvq4v87wrnqweq3b234tb2vNN")
       d = hashlib.md5(s).hexdigest()
       return [d,s]

def main():
    #第一引数がIDの長さ、第二引数がパスワードの長さ`
    p = IdInf_gen(10,15)
    print "Content-Type: text/html;charset=utf-8"
    print
    print "ID:" + p.inst()['id'] + "<br>"
    print "Crypt PD:" + p.inst()['pw'] + "<br>"
    print "ORIGIN PD:" + p.inst()['pw_org'] + "<br>"

if __name__  ==  '__main__':
    main()

# chmod 755 disp.py

コンソールで確認)
# ./disp.py

ブラウザで確認)
http://yourhost/yourpath/disp.py

Python WEBアプリをCGIで使う(前編)

「Python WEBアプリをCGIで使う」は一番手軽な作り方。既に作られているプログラムの継接ぎやちょっとした機能を作るならこれで十分。
確かに簡単ですから。WEBサーバへの設定が少なくて済む。

ApacheのWEBサーバ設定は基本気をつけるのは2箇所くらい。
CGIスクリプトのパス設定とExecCGIを追加すること。WEBサーバは言語に関係なくコンテンツプログラムを拡張子.cgiにしておけば
デフォルト設定でハンドラーのあたりはOKだ。 下記に仮想ホストのサンプルを貼り付ける。

<Virtualhost *:80>

ServerName  test.example.com
ServerAdmin test@example.com
CustomLog logs/test.access_log common
ErrorLog logs/test.error_log

DocumentRoot /home/www/html/httpdocs

ScriptAlias /cgi-bin/ /home/www/html/cgi-bin/
    <Directory "/home/www/html/cgi-bin">
        AddHandler cgi-script .py .cgi
        AllowOverride None
        Options ExecCGI SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
    </Directory>
   <Directory "/home/www/html/httpdocs">
        AllowOverride All
        Options ExecCGI SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all

   </Directory>
</virtualHost>