2011年3月15日火曜日

PythonでHTML文書をPDF化する。

PyJaPDFというモジュールを使えば出来るようだ。

--引用--
Pisa は HTML/XHTML と CSS から PDF を生成するものです。2010年2月1日時点では、まだ日本語に対応しておらず、フォントとしては Courier, Helvetica, Times, Symbol 程度しか扱えないものです。しかし基盤としては ReportLab を利用しており、若干の修正を加えることで、日本語の出力が可能になります。
---
http://pyjapdf.linxs.org/home/pisa

2011年3月11日金曜日

Django + PythonでPDF作成

1.インストール
easy_install -U reportlab

2.実行
from reportlab.pdfgen import canvas
from django.http import HttpResponse

def some_view(request):
    response = HttpResponse(mimetype='application/pdf')
    response['Content-Disposition'] = 'attachment; filename=somefilename.pdf'
    p = canvas.Canvas(response)

    #帳票レイアウト描画
    p.drawString(100, 100, "Hello world.")

    p.showPage()
    p.save()
    return response

PDFレイアウトをちまちま書いていくのは大変なので、
テンプレート画像を読み込んで、そこに記入していく方式をとってみる。

from reportlab.pdfgen import canvas
#!/user/bin/env python
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from reportlab.pdfgen import canvas  
from reportlab.lib.units import mm  

# Create your views here.
def sample1(request):
 response = HttpResponse(mimetype='application/pdf')
 #response['Content-Disposition'] = 'attachment; filename=c:\\tmp\\somefilename.pdf'
 response['Content-Disposition'] = 'attachment; filename=somefilename.pdf'
 p = canvas.Canvas(response)

 #テンプレート読み込み(A4サイズ[595x841], テンプレートサイズ[453x785])
 _lft = 30
 _top = 10
 _rit = 20
 _btm = 10
 _wid = 210 - _lft - _rit
 _hei = 297 - _top - _btm
 p.drawInlineImage("c:\\tmp\\test.png", 
   _lft*mm,
   _btm*mm,
#   width=_wid*mm,
#   height=_hei*mm,
#   preserveAspectRatio=True
 )

 #記入項目
 p.drawString(0*mm, 0*mm, "Hello world1.")
 p.drawString(40*mm, 100*mm, "Hello world2.")
 p.drawString(40*mm, 200*mm, "width=%d, height=%d" % (_wid*mm, _hei*mm))
    
 p.showPage()
 p.save()
 return response

これで仕上がったPDFを印刷してみるとわかるけど、
テンプレート内に入っている文字はドットが荒くなるので、
線の枠組みだけテンプレートに書いて、文字は別途挿入した方がいい。

あとテンプレートのサイズはソースコード内に記述したサイズにすると
原寸大で描画できる。


参照リンク
http://docs.nullpobug.com/django-doc-ja/trunk/howto/outputting-pdf.html
http://d.hatena.ne.jp/piro_suke/20070704/1183561248
http://tt-house.com/2009/12/python-reportlab-pdf.html

2011年3月10日木曜日

pythonで扱う文字列について

Linuxは「UTF-8」、Windowsは「Shift-JIS」という認識だったけど、
実は間違いであるw

Windowsは拡張Shift-JISというものを使っていて、
エンコードの際に"Shift-JIS"を指定していると
「㎡」こういうコードは範囲外なのでエンコードエラーになる。

なので、通常Windowsが使用するエンコードに合わせるなら
"CP932"で覚えておいたほうがよさそう。

2011年3月9日水曜日

pythonでLZH形式ファイルを解凍する

UNLHA32.DLLを利用した解凍方法など検索すると
---
(Windowの場合)
windll.UNLHA32.Unlha(0, r'x -r1 -n "%s\\%s" "%s\\" *.*' % (path, fname, path), None, 0)
---
こういうやり方でできるものがあった。

もっとシンプルやりたかったので別の探してみたら見つけた。

前提条件:
・VC++が入っている事。
basetsd.hが無いとエラーが出たらKoderよりヘッダソースをコピーしてくる。
http://www.koders.com/c/fid4BF9F859DE62B18F2A3C47B66D776CDDE9D75AF4.aspx

1.インストール
easy_install、pipのパスが通ってない場合はフォルダ移動して(例:d:\traclight\python\scripts)

% easy_install http://svn.neotitans.net/lhafile/
% pip install http://svn.neotitans.net/lhafile/

実行。
コンパイル成功して
 python\Lib\lzhlib.pyd
が入っていたらインストール完了。

2.使い方
import lhafile

# Create Lhafile instance from filename
f = lhafile.Lhafile('foo.lzh')

# Print each file informaion in archive file.
for info in f.infolist():
   print info

# Extract data from archive
f.read('bar.txt')

追記:
使ってみてみたらまだバグがあるらしいので注意。
2011.05.27
作者the-o様に修正していただきました!
thank you:)


参考URL
http://trac.neotitans.net/wiki/lhafile

2011年3月7日月曜日

Debianで無線LANモジュールを使う

手元にあるUSBタイプの無線LAN(Planex製 GW-USMicron)をDebian環境で
使ってみた。

このGW-USMicronという製品に使われている無線モジュールICはRT2870が使われているらしいので、
「Debian RT2870」で検索すると、

 http://wiki.debian.org/rt2870sta

DebianWikiにやり方が解説されているものを発見。
内容を読むと、aptitudeでインストールでOKぽい。
そんなわけで、さっそくやってみた。

1.aptソース(資源)の設定。
/etc/apt/sources.list
deb http://ftp.us.debian.org/debian squeeze main contrib non-free

2.無線ツールのインストール。
aptitude update
aptitude install firmware-ralink wireless-tools

3.モジュール読み込み、起動。
modprobe rt2870sta
iwconfig
ifconfig wlan0 up


ソースコンパイルする覚悟だったけど、apt使えて便利だなー。

2011年3月1日火曜日

WinCEでUSBシリアル変換ケーブルを使う。

WinCEでUSB-シリアル変換ケーブルをできるようにするには、
変換ケーブルに使われているICチップが「PL2303」でないといけないようだ。
ドライバと必要なUSB-RS232C変換ケーブルをメモしておく。

追記:2011.04.04
より簡単な方法を見つけた。

秋月電商のUSBシリアルケーブルを使う場合(PL2303チップ)
http://www.prolific.com.tw/eng/downloads.asp?id=31

上記サイトからCABをダウンロード&インストールするだけでよい。
COMポート番号はCOMポート一覧の一番下に表示されるCOM**(MOC**は除く)になる。

WinCE6にて動作確認済み。


<旧手順>
↓↓↓上記ドライバ以外で行う場合↓↓↓

[手順]
 1.ドライバのダウンロードとケーブルを用意する。
 2.ドライバのインストールはDLLをWindowsフォルダにコピー。
   レジストリ設定ファイルがあれば、RegEditから設定ファイルのインポート。
 3.USB-シリアル変換ケーブルを挿す。
 4.RS232C設定アプリがあればアプリで設定する。


通信テストして動けばOK。

他の情報を探したい場合は、Googleの検索ワードで、「CE PL2303」など
「OS名とチップ名」を合わせて検索すると良くヒットしやすい気がする。



○ドライバ
 WindowsCE2.0以降(CDC ACM準拠のUSBモデムやPL2303、FTDI用のシリアルデバイスドライバ)
  http://z.apps.atjp.jp/ce/

 WinCE6.0用
  http://solarisintel.cocolog-nifty.com/blog/2010/12/windows-ce6-pl2.html
  http://solarisintel.cocolog-nifty.com/blog/2010/09/ce6232usbdll-44.html


○変換ケーブル
 PL2303系のチップ
  ・秋月電子 USBシリアル変換ケーブル
   http://akizukidenshi.com/catalog/g/gM-02746/
   http://akizukidenshi.com/catalog/g/gM-00720/

  ・エレコム UC-SGT
   http://www2.elecom.co.jp/cable/usb/uc-s/gt/




参考URL
http://www.geocities.jp/le_grand_concierge2/_geo_contents_/diy/USB_Serial_exchange/USB_Serial_exchange.htm
http://wiki.tomocha.net/Windows_Vista_USB-RS232C.html

2011年2月28日月曜日

正式アップデートされたSqueezeとUpstartについて

先日正式リリースされたDebian Squeeze(スクイズ)で
起動がsysvinitからupstartに変わる!っていう前情報に心浮かれていたのだが
どうも変更は変更は来なかったぽい。

ちなみに組み込みボードでsqueezeインストールしてaptitudeでupstartインストールして、
manコマンドでupstartの設定方法を調べつつ、Ubuntu環境みつつ(過去記事参照)
initsの代わりになる「/etc/init」ディレクトリを作成して設定ファイルの移植をやった事がある。

入れ替えたとき、起動時間が劇的に!(人によるが)変わると思っていた。
しかし現実派sysvinitをそのまま移植した程度では、
1分かかった起動が10秒くらい早くなる程度でした。

※debootstrap(最小構成)にhttpサーバ入れただけの構成なので、早くなる要素は少ないし、
チューニングしてないのも影響あると予想してる。


よく考えてみれば起動シーケンスで早くなる部分ってサービス立ち上げの時であって、
Sysvinitでランレベルによるシーケンス起動からイベントドリブンになった部分。
つまり、

1.電源ON
2.ブートローダ立ち上げ
3.Kernel展開
4.ハード初期化
5.サービス起動

Upstart導入で1~4は早くなる余地は無いんだよね
5からUpstart本領発揮だと思うので組み込み用途にはあまり意味なさそうだ。


あと、ざーっと起動ログ眺めて遅いなと思ったのは、
・電源ON~ローダ立ち上がるまで(5秒?)
・u-boot(ローダ)の待ち時間(3秒設定)
・SDカード初期化(5秒?)
・DHCPクライアント起動(5秒?)
・ログサーバ起動(3秒?)
・lighttpサーバ起動(3秒?)
あとは滝のようなログで1秒未満のがぽつぽつあったくらい。

上で出した数字を合計するだけでも25秒だから
大して早くなる訳でもなさそう。
なので、早くしたいならSysvinitはそのままでディスプレイOFFや
サスペンド処理で起動時間早くした方が現実的な気がしたのが結論。
(それでも早くするなら個人的にはbusybox使うといいと思う)

Windows環境でdjango+バーコード作成モジュールをインストールする

Windows環境でPython + Sqlite + Django開発環境を簡単に構築する方法。

手軽に構築したい人向け。

1.TracLightingをダウンロード&インストール。
 http://sourceforge.jp/projects/traclight/wiki/FrontPage
 インストール場所>D:\TracLight
 ダウンロードしたEXEファイルを実行してインストールディレクトリを上記に設定。


2.Django公式ページからDjango本体をダウンロード&インストール。
 http://www.djangoproject.com/download/
 インストール場所>D:\tmp\django
  Admin権限でDOSプロンプト実行。インストール場所へ移動して、
  python setup.py install

  プロジェクトの作り方。
   python d:\TracLight\python\Scripts\django-admin.py startproject <プロジェクト名>


3.fastcgiでdjango起動するように設定
nginx + gunicorn + django設定例
Pythonの正規表現ライブラリが足りなくてgnicornで動かなかったので、
通常のFastcgiで動かす方法でflupをインストール。
 easy_install -U flup
 nginx.confの設定は、自身のポート番号(80)の設定とfastcgiの設定の2つ。

 上記リンクに書かれている部分
 #host to gunicorn serverから改行までの設定をコメントアウト
 ##host and port to fastcgi serverから改行までの設定をコメントアウト解除
 にする。


4.バーコード作成ライブラリ「huBarcode」をダウンロード&インストール。
easy_intsll PIL
easy_install -U huBarcode

5.動作確認。
  <サンプルコード>
from ean13 import EAN13Encoder

    _barcode = EAN13Encoder(’123456789012′)
    _barcode.save(“test_barcode.png”)

これで完了。

起動させるには、
 python manage.py runfcgi method=threaded host=127.0.0.1 port=8000
 nginx.exe

nginxを停止するなら
nginx.exe -s stop

2011年2月25日金曜日

Windows環境下でxamppを構築する

今まで独自フレームワークや簡易WEBサーバの実装までやってきたのだが、
ここにきて既存のCakePHPを使うことにしてみた。
久々にWindows環境で開発なので、aptitudeコマンドじゃなくWEBサイトからダウンロード。

1.XAMPPのインストーラをダウンロード&インストールする。
http://www.apachefriends.org/jp/xampp-windows.html

これでおわり。

2011年2月23日水曜日

.NETを使った簡易HTTPサーバーの実装

C#.NETを使って簡易HTTPサーバーを立ててみようと思ったら、

static void Main(string[] args)
        {
            string root = "d:\\wwwroot\\";
            string prefix = "http://+:8080/";

            if (!HttpListener.IsSupported)
            {
                Console.WriteLine(".Net frameworkのHttpListenerクラスがサポートされていません。");
                Console.WriteLine("何かキーを押してください");
                Console.ReadKey();
                return;
            }

            HttpListener listener = new HttpListener();
            listener.Prefixes.Add(prefix);
            try
            {
                listener.Start();
            }
            catch (HttpListenerException hle)
            {
                Console.WriteLine("error:{0}", hle.Message);
                Console.WriteLine("何かキーを押してください");
                Console.ReadKey();
                return;
            }

            while(true){
                HttpListenerContext context = listener.GetContext();
                HttpListenerRequest req = context.Request;
                HttpListenerResponse res = context.Response;

                Console.WriteLine(req.RawUrl);

                string path = root + req.RawUrl.Replace("/", "\\");
                if(File.Exists(path)){
                    byte[] content = File.ReadAllBytes(path);
                    res.OutputStream.Write(content, 0, content.Length);
                }
                res.Close();
            }
        }
    }

18行目で、「HttpListenerException例外エラー」が発生する。

原因を調べてみたら、
WinOS管理者権限で「XXユーザがこのPrefixを使いますよ」と事前申請が必要なようだ。
(バックドア攻撃の予防策か、Linuxに合わせたのかどっちかかなーと思ってみたり。)

解決策はcmd.exeを管理者権限で実行して、netshコマンドを使えば良い。

まずはnetshコマンドについて調べてみた。
C:\windows\system32>netsh ?

使用法: netsh [-a エイリアス ファイル名] [-c コンテキスト] [-r リモート コンピュ
ーター名] [-u [ドメイン名\]ユーザー名] [-p パスワード | *]
              [コマンド | -f スクリプト ファイル名]

使用できるコマンドは次のとおりです:

このコンテキストのコマンド:
?              - コマンドの一覧を表示します。
add            - エントリの一覧に構成エントリを追加します。
advfirewall    - 'netsh advfirewall' コンテキストに変更します。
bridge         - 'netsh bridge' コンテキストに変更します。
delete         - エントリの一覧から構成エントリを削除します。
dhcpclient     - 'netsh dhcpclient' コンテキストに変更します。
dnsclient      - 'netsh dnsclient' コンテキストに変更します。
dump           - 構成スクリプトを表示します。
exec           - スクリプト ファイルを実行します。
firewall       - 'netsh firewall' コンテキストに変更します。
help           - コマンドの一覧を表示します。
http           - 'netsh http' コンテキストに変更します。
interface      - 'netsh interface' コンテキストに変更します。
ipsec          - 'netsh ipsec' コンテキストに変更します。
lan            - 'netsh lan' コンテキストに変更します。
mbn            - 'netsh mbn' コンテキストに変更します。
namespace      - 'netsh namespace' コンテキストに変更します。
nap            - 'netsh nap' コンテキストに変更します。
netio          - 'netsh netio' コンテキストに変更します。
p2p            - 'netsh p2p' コンテキストに変更します。
ras            - 'netsh ras' コンテキストに変更します。
rpc            - 'netsh rpc' コンテキストに変更します。
set            - 構成の設定を更新します。
show           - 情報を表示します。
trace          - 'netsh trace' コンテキストに変更します。
wcn            - 'netsh wcn' コンテキストに変更します。
wfp            - 'netsh wfp' コンテキストに変更します。
winhttp        - 'netsh winhttp' コンテキストに変更します。
winsock        - 'netsh winsock' コンテキストに変更します。
wlan           - 'netsh wlan' コンテキストに変更します。

利用できるサブコンテキストは次のとおりです:
 advfirewall bridge dhcpclient dnsclient firewall http interface ipsec lan mbn n
amespace nap netio p2p ras rpc trace wcn wfp winhttp winsock wlan

コマンドのヘルプを表示するには、コマンドの後にスペースを入れ、
 ? と入力してください。


C:\windows\system32>netsh http ?

使用できるコマンドは次のとおりです:

このコンテキストのコマンド:
?              - コマンドの一覧を表示します。
add            - テーブルに構成エントリを追加します。
delete         - テーブルから構成エントリを削除します。
dump           - 構成スクリプトを表示します。
flush          - 内部データをフラッシュします。
help           - コマンドの一覧を表示します。
show           - 情報を表示します。

コマンドのヘルプを表示するには、コマンドの後にスペースを入れ、
 ? と入力してください。


C:\windows\system32>netsh http show

使用できるコマンドは次のとおりです:

このコンテキストのコマンド:
show cacheparam - HTTP サービスのキャッシュ パラメーターを表示します。
show cachestate - キャッシュされた URI リソースとこれらの関連プロパティを一覧表
示します。
show iplisten  - IP リッスン一覧内のすべての IP アドレスを表示します。
show servicestate - HTTP サービスのスナップショットを表示します。
show sslcert   - IP アドレスおよびポートに対する SSL 証明書のバインドを表示しま
す。
show timeout   - サービスのタイムアウト値を表示します。
show urlacl    - URL 名前空間の予約を表示します。


なるほど。
覚えておけばいいのは、
 ・URL名前空間の追加:netsh http add
 ・URL名前空間の削除:netsh http delete
 ・URL名前空間の一覧:netsh http show urlacl

の3つ。

本題に戻って結論。
解決の仕方は、1つのコマンド打つだけ。
//url:使用するprefix
//user:HTTPサーバを起動するユーザ or ドメイン/ユーザ名

netsh http add urlacl url=http://+:8080/ user=eeepc

簡易HTTPサーバを起動してみると無事サーバが立ち上がる。
よかったよかった。


未検証メモ:
 URL一覧を見ると、全ユーザを許可するのは:Everyone らしい。


参考URL:
http://www.atmarkit.co.jp/fdotnet/dotnettips/695httplistener/httplistener.html
http://msdn.microsoft.com/ja-jp/library/ms733768.aspx

2011年2月9日水曜日

Lighttpdでエラー表示をカスタマイズするには

1.サーバ設定
/etc/lighttpd/lighttpd.confファイルを編集。

server.errorfile-prefix = "/var/www/error-"

を追加して

2.エラー表示用HTMLテキストの準備
/var/www/フォルダに
error-401.html
error-403.html
error-404.html
error-500.html

など、エラーに対応したHTMLテキストを用意。


これで好きなエラー画面表示させることが出来る。

参考URL:
http://www.drk7.jp/MT/archives/001009.html

2011年2月2日水曜日

lighttpdで""I will not set uid to 0" lighttpd"エラー

lighttpd.confの設定で
server.username = "root"
server.groupname = "root"

のようにroot設定するとエラーが出てくる。
これがわかるまでlighttpdが全く起動しなくなって少しあせったのでメモ。

デフォルトは、
server.username = "www-data"
server.groupname = "www-data"

なのでこれに戻しておくとエラーは消える。
エラーログ出力先の権限は別途行う必要はあるけど。

2011年2月1日火曜日

ログイン後にプログラムの実行

エディタで ~/.bash_profile を開き一番下に実行するプログラムのパスを書きます

内容:

"ログイン後にプログラムの実行"
- LinuxGoogle サイドウィキで表示

Androider