2007年12月18日火曜日

pythonで PowerPointを操作する。

win32com.clientを使う。
DispatchExメソッドを実行してPowerPointのオブジェクトを取得する。
それ以降はなんとなく関数を実行していく。

以下サンプル。

・powerpoint.py
#!/bin/env python
# -*- encoding: shift-jis -*-
import sys
import os
import re
import time
import win32com.client, pythoncom



from_path="test.ppt"
pythoncom.CoInitializeEx(pythoncom.COINIT_APARTMENTTHREADED)
ppt = win32com.client.DispatchEx('Powerpoint.Application')
ppt_file = ppt.Presentations.open(from_path, False, False, False)
slide_count = ppt_file.Slides.Count
for slide_num in range(1, slide_count):
print slide_num
slides=ppt_file.Slides(slide_num)
#################3
#オブジェクト
##################
for i in range(1,slides.Shapes.Count):
print i
try:
print slides.Shapes(i).TextFrame.TextRange.Text
except:
pass



win32com.clientでExcelを操作する方法は以下のサンプル。
・ExcelSample.py

#-*- coding:utf-8 -*-
"""
win32モジュールを使用してExcelを操作するサンプル
"""

import win32com.client

#Excel.Applicationを起動
xlApp=win32com.client.Dispatch("Excel.Application")

#visible
xlApp.Visible=1

#workbooksを追加
xlApp.Workbooks.Add()

#シートを指定
sheet=xlApp.Workbooks(1).Sheets(1)

#シートの(1,1)に値を代入
cellObj=sheet.Cells(1,1)
cellObj.Value="Hello From Python"
cellObj.Font.Size=18

sheet.Range("A2:A5").Value=("A2","A2","A2","A2")
sheet.Range("B2:C5").Value=(("B2","C2"),("B2","C2"),("B2","C2"),("B2","C2"))
sheet.Range("A2:C5").Borders.Weight=2

#ファイルの保存
xlApp.Workbooks(1).SaveAs(Filename='output.xls')

#終了
xlApp.Quit()

グラフを描写するサンプル。
・ExcelGraphSample.py
#-*- coding:utf-8 -*-
"""
win32モジュールを使用してExcelを操作するサンプル
"""

import win32com.client

#data
MyData = ( ('Name','Value'), ('A',5), ('B',2), ('C',3), ('D',7), )
MyRange = "A1:B5"

#Excel.Applicationを起動
xlApp=win32com.client.Dispatch("Excel.Application")

#visible
xlApp.Visible=1

#workbooksを追加
xlApp.Workbooks.Add()

#シートを指定
sheet=xlApp.Workbooks(1).Sheets(1)

#
DataRange = sheet.Range(MyRange)
DataRange.Value = MyData

#ChartWizard
xlChart=xlApp.Charts.Add()
xlChart.ChartWizard( Source=DataRange ,
Gallery =3 ,
Format=None,
PlotBy=2,
CategoryLabels=1,
SeriesLabels=1,
HasLegend=1,
Title='sample',
CategoryTitle='NAme',
ValueTitle='Value'
)

#シート上にグラフ作成
xlChart2 = xlApp.Charts.Add()
xlChart2.ChartWizard(DataRange, 2, None, 2, 1, 1, 1,'Sample01', 'Name', 'Value','Extra')

xlChart2.Location(2, "Sheet1")    #Sheet1に表示する
xlChartObj = sheet.ChartObjects(1)
CellC2 = sheet.Cells(2,3)    #セルC2を基準に使う
xlChartObj.Left, xlChartObj.Top = CellC2.Left, CellC2.Top    #位置の設定
xlChartObj.Width, xlChartObj.Height= CellC2.Left * 2, CellC2.Height * 10  #縦横サイズの設定     

#ファイルの保存
xlApp.Workbooks(1).SaveAs(Filename='graph.xls')

#終了
xlApp.Quit()

2007年11月28日水曜日

sakuraエディタでの pythonキーワード設定

sakuraエディタでpythonキーワードの設定
デフォルトではpythonについてハイライト表示などは設定されていない、
しかし、すでにキーワード設定ファイルなどは用意されている。




sakura editor起動->設定->共通設定->強調キーワードタブ
セット追加ボタン 名前はpython
インポートボタンでpython.kwdを読み込ませる。

メニュー->設定->タイプ別設定一覧
設定17を選択し、設定変更ボタンを押す。
スクリーンタブ
設定の名前:python
ファイル拡張子:py

カラータブ
コメントスタイルブロック型""" ~"""
コメントスタイル行型:#
強調キーワードにpythonを選択


これで設定完了

2007年10月3日水曜日

mantis

mantisという名のBTS(Bug Tracking System)です。

必須のアプリケーションは Apache+PHP+MySqlというわけでXAMPPを使うのが
簡単。
というわけでXAMPPをインストール。

mantis の圧縮ファイルを解凍し、Apacheの設定でPHPを使える設定を
行い、htdocs配下に配置すれば使えるようになる。

http://localhost /mantis/admin/をアクセスすると、mantisのデータベース
作成が行えるようになる。

http://manual.mantisbt.org/

2007年9月29日土曜日

pythonでOpenGL

pythonでOpenGLでも使いましょうということで、

1.setuptools のインストール
パッケージインストールツール。windows pythonにはデフォルトでインストール
されていないのでインストールする必要がある。
PyOpenGLのインストールに必要である。

インストール方法:
python-setuptools のセットアップファイルをダウンロード
#wget http://peak.telecommunity.com/dist/ez_setup.py
#python ./ez_setup.py

2.glut のインストール
OpenGLを使用するためのライブラリ
glut-3.7.6-bin.zipをダウンロードして、解凍する。
*dll を
C:WINDOWSsystemへコピーする。
C:WINDOWSsystem32へコピーする。

3.PyOpenGL のインストール
PyOpenGL-3.0.0a6.tar.gzをダウンロードして展開をする。
#cd PyOpenGL-3.0.0a6
#python setup.py install
これでインストール完了。

4.pygame のインストール
pygame-1.7.1release.win32-py2.5.exeをダウンロードして
インストールする。


4 はついでにインストールしましたw

これでpythonでOpenGLが使えるようになります。

以下簡単なサンプル
#!/usr/bin/python
import sys
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *

init_flag = 0

def display():
global init_flag
if not init_flag:
glEnable( GL_LIGHTING )
glEnable( GL_LIGHT0 )
glEnable( GL_DEPTH_TEST )
init_flag = 1

glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT )
glPushMatrix()
gluLookAt( 0,3,-10, 0,0,0, 0,1,0 )
glutSolidTeapot( 2 )
glPopMatrix()
glFlush()

def reshape(w,h):
glViewport( 0, 0, w, h )
glMatrixMode( GL_PROJECTION )
glLoadIdentity()
gluPerspective( 45.0, 1.0*w/h, 0.1, 100.0 )
glMatrixMode( GL_MODELVIEW )
glLoadIdentity()

def keyboard(key,x,y):
if key==chr(27): sys.exit(0)

glutInit( sys.argv )
glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH )
glutInitWindowSize( 256, 256 )
glutCreateWindow( 'teapot' )
glutReshapeFunc( reshape )
glutKeyboardFunc( keyboard )
glutDisplayFunc( display )
glutMainLoop()

2007年9月22日土曜日

画像のファイルフォーマットについて

C言語でファイルフォーマットチェック関数を簡単に作ってみました。
今後はファイルサイズなどもチェックできるように使用と思います。
JPEGフォーマットについて:
http://siisise.net/jpeg.html#format

int checkextent( char* chp_file ) {
int in_cnt = 0;
int in_ret = 0;

char* chp_ret = NULL;
char cha_buff[ BUFF_SIZE + 1];

FILE* fp = NULL;

chp_ret =fgets( cha_buff, BUFF_SIZE , fp );
if ( *chp_ret = 0xFFFFFFFF && *(chp_ret+1) == 0xFFFFFFD8 ) {
return JPEG_FORMAT;
}else if ( *chp_ret == 'G' && *(chp_ret +1 ) == 'I' &&
*(chp_ret +2)== 'F' ) {
return GIF_FORMAT;
}else if ( *chp_ret == 0xFFFFFF89 && *(chp_ret +1 ) == 0x50 &&
*(chp_ret +2 ) == 0x4E &&
*(chp_ret +3 ) == 0x47 &&
*(chp_ret +4 ) == 0x0D &&
*(chp_ret +5 ) == 0x0A ) {
chp_ret = fgets( cha_buff, BUFF_SIZE , fp );
if ( *(chp_ret ) ==0x1A &&
*(chp_ret +1 ) == 0x0A ) {
return PNG_FORMAT;
}
}
fclose( fp );
return NG;
}

2007年9月17日月曜日

FTPやらtelnetなどを使ってみる。

windowsから色々な場所へftp,telnetをしたくなる場合があるため、ちょっと調べてみました。


■FTPモジュールの使い方
基本的なftpモジュールの操作
結構primitiveなことができるため、ftpを覚えるという点からもよいかもしれない。
from ftplib import FTP
ftp = FTP( SERVER )
ftp.login( USER , PASS )
ftp.cwd( PUT_PATH )
fp_up = open( i , "r" )
ftp.storlines( "STOR "+PUT_FILE , fp_up )
fp_up.close()
ftp.close()

※FTPとかによく使う豆知識
現在のディレクトリを取得
import os
print os.path.dirname(os.path.abspath(__file__))


■telnetモジュールの使い方
これはまぁ、そのままです。
import telnetlib
tn =telnetlib.Telnet( FUMIDAI )
response=tn.read_until( PROMPT[cnt] )
tn.write( WRITE_DATA[cnt]+ '\n' )
tn.close()

2007年9月14日金曜日

プログラムのお勉強

【アセンブラの勉強】
とりあえず、gcc -vでコンパイルの詳細情報を出力する。
# gcc -v sample.c
Reading specs from /usr/lib/gcc-lib/i586-suse-linux/3.3.4/specs
Configured with: ../configure --enable-threads=posix --prefix=/usr --with-local-prefix=/usr/local --infodir=/usr/share/info --mandir=/usr/share/man --enable-languages=c,c++,f77,objc,java,ada --disable-checking --libdir=/usr/lib --enable-libgcj --with-gxx-include-dir=/usr/include/g++ --with-slibdir=/lib --with-system-zlib --enable-shared --enable-__cxa_atexit i586-suse-linux
Thread model: posix
gcc version 3.3.4 (pre 3.3.5 20040809)
/usr/lib/gcc-lib/i586-suse-linux/3.3.4/cc1 -quiet -v -D__GNUC__=3 -D__GNUC_MINOR__=3 -D__GNUC_PATCHLEVEL__=4 sample.c -quiet -dumpbase sample.c -auxbase sample -version -o /tmp/cclBAc0J.s
GNU C version 3.3.4 (pre 3.3.5 20040809) (i586-suse-linux)
compiled by GNU C version 3.3.4 (pre 3.3.5 20040809).
GGC heuristics: --param ggc-min-expand=55 --param ggc-min-heapsize=48247
#include "..." search starts here:
#include <...> search starts here:
/usr/local/include
/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include
/usr/i586-suse-linux/include
/usr/include
End of search list.
/usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../../i586-suse-linux/bin/as -V -Qy -o /tmp/cco4tK3p.o /tmp/cclBAc0J.s
GNU assembler version 2.15.91.0.2 (i586-suse-linux) using BFD version 2.15.91.0.2 20040727 (SuSE Linux)
/usr/lib/gcc-lib/i586-suse-linux/3.3.4/collect2 --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 /usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../crt1.o /usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../crti.o /usr/lib/gcc-lib/i586-suse-linux/3.3.4/crtbegin.o -L/usr/lib/gcc-lib/i586-suse-linux/3.3.4 -L/usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../../i586-suse-linux/lib -L/usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../.. /tmp/cco4tK3p.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc-lib/i586-suse-linux/3.3.4/crtend.o /usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../crtn.o


まとめると。
cc1、as、collect2を使ってコンパイルを行っている。
cc1はCのソースをアセンブラコードに落とし、asでアセンブラからオブジェクトコードに変換し,
collect2はリンカでオブジェクトファイルをリンカなどで紐付ける。

もっとわかりやすくすると。
cc1 -quiet -v -D__GNUC__=3 -D__GNU_MINOR__=3 -D__GNU_PATCH_LEVEL__=4 sample.c -quiet -dumpbase sample.c -auxbase sample -version -o sample.s
これは色々なマクロ変数を定義し、sample.cを元にsample.sを作成する

次にアセンブラコードを
as -V -Qy -o sample.o sample.s
これでオブジェクトファイルを作成。

collect2 を使ってオブジェクトファイルから実行ファイルを作成する。
また、ldコマンドを実行しても同じことが作れる。

/usr/lib/gcc-lib/i586-suse-linux/3.3.4/collect2 --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 /usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../crt1.o /usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../crti.o /usr/lib/gcc-lib/i586-suse-linux/3.3.4/crtbegin.o -L/usr/lib/gcc-lib/i586-suse-linux/3.3.4 -L/usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../../i586-suse-linux/lib -L/usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../.. /tmp/cco4tK3p.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc-lib/i586-suse-linux/3.3.4/crtend.o /usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../crtn.o


最後の collectはすっげーめんどくさい。

実際のコンパイルはこんなことをやっています。

次回はアセンブラコードを書いて、標準出力するサンプルを作ってみようかと。