2013年9月29日 星期日
使用 wkhtmltopdf 將網頁轉成 PDF檔
2. 再編輯一串文字檔, 每一行的內容為皆為想要抓取的 URL , 後面緊跟要存成的 PDF 檔名, 將此黨命名為 note.txt
3. note.txt 範例:
http://madalgo.au.dk/~jakobt/wkhtmltoxdoc/wkhtmltopdf-0.9.9-doc.html 0
... 1
以此類推
3. 用 python 寫個 batch 程式, 將上述連結 URL 一行一行轉成 PDF:
url2pdf.py
----------------------------
import os
ff=open('note.txt','rt')
while True:
str=ff.readline()
if not str: break
sss=os.popen('"C:\\Program Files (x86)\\wkhtmltopdf\\wkhtmltopdf" '+str.strip('\n')+'.pdf')
sss.read()
sss.close()
ff.close
-----------------------------
4. 將會獲得 0.pdf, 1.pdf, 2.pdf, ...
2013年7月13日 星期六
scilab 呼叫 share library(Windows DLL)
a=link("sharelib.dll","dllfunction","c");
o=0;
o=call("dllfunction",arg1,1,"i",arg2,2,"i","out",[length(o) 1],3,"i");
unlink(a);
其中 call 有幾個關鍵須先明瞭
1. 是 "out" 字眼,他是指明當呼叫 DLL 的函數時,等號左邊右邊的變數的分界點,"out" 之前的參數稱作 Righthand side input variables, "out" 之後的參數稱作 Lefthand side output variables.
2. 參數 arg(n) 須擺在當呼叫 DLL 時第幾(m)個參數必須被明確指出, 否則會出現記憶體分配錯誤的情形.(如上例:參數 arg1 當第一個, 參數 arg2 當第2 個, 第3個被當成傳回值且放到等號左邊第一個變數,且記憶體需要[lenghth(o) 1] 個陣列的空間
3. 當作 Lefthandside 的記憶體數量須先自行分配好足夠空間以便容納所傳回的陣列(或變數)
4. scilab 都是call by reference(也就是說它會傳變數的記憶體位址過去給DLL函數)
5. 資料型態共有 4 種: "i" 是 integer, "r" 是 real, "d" 是 double, "c" 是 character 註:
// 當'out'存在時的呼叫方式:
[y1,...,yk] = call("ident",x1,px1,"tx1",...,xn,pxn,"txn","out",[ny1,my1],py1,"ty1",...,[nyl,myl],pyl,"tyl")
使用 tinyCC 建立 DLL 讓 freemat 呼叫
//calldll.c
#include "windows.h"
typedef void (*FreematPrint)(const char*);
FreematPrint FreematConsole;
__declspec(dllexport) void freemat_io_handler(FreematPrint pname) { FreematConsole = pname; }
__declspec(dllexport) void calldll(int i)
{
char sbuf[1024];
sprintf(sbuf,"Freemat console print. You are passing an integer %d:sizeof(int)=%d bytes\n",i,sizeof(int));
FreematConsole(sbuf);
}
%%calldll.m
import('calldll.dll','calldll','mCalldll','void', 'int32 st');
mCalldll(1232138);
REM makedll.bat
tcc -shared calldll.c -ocalldll.dll
----- Freemat console snapshot --------
--> calldll
Freemat console print. You are passing an integer 1232138:sizeof(int)=4 bytes
-->
2013年7月6日 星期六
學學 Maxima 先搞定運算元
g1(x,y) := 2x+y=7;
g2(x,y) := 3x-7y=10;
solve([g1(x,y),g2(x,y)],[x,y]);
2. 指定運算元 ":", 定義運算式,將右邊的運算式指定給左邊的變數
a:3
此時 a 等於 3
3. 指定運算元 "::", 除了將右邊的值指定給左邊的變數外, 同時也將其值賦予其指定的運算式, 可以用"雙重指定"來幫助記憶
x: foo
x:: 123
此時 x 等於 foo, 而 foo 等於 123
4. 函數定義運算元 ":="
f(x,y) := x + y+1
g(x,y) := x -y +3
在此定義f(x,y) 為兩個變數的函數, 而 g(x,y) 為另一個含兩個變數的函數
5. 巨集定義運算元 "::=", 一連串的函數集合
f(x,y)::=(print("x=",x),print("y=",y));
6. 使用者也可以自行定義運算元, 如下可將 "dd" 當成 單個字符的前置運算元(不含雙引號)
prefix("dd");
經上述定義後, dd a 就如同 dd(a) 的用法了
7. 自行定義兩個字符中間的運算元, 如下可將 "##" 當成中間運算元(不含雙引號)
infix("##");
如再搭配運算元 := 來將運算式指定成函數後, 可以讓新的中間運算元賦予新意義
a ## b := a^b
經上述定義後, ## 運算元就如同 ^ 的用法了
8. kill 可以將上述運算元的定義及運算式全部移除
kill("dd");
kill("##");
remove 也可以將上述運算元的定義移除, 但只移除運算元定義的部份
remove("##,op);
9. 運算元 "'" 強制不做賦值運算
foo: 30;
x: 'foo;
在此例中, foo 雖已指定等於 30, 但加上運算元後, 僅就字串將 foo 賦予 x
10. 繪圖 plot2d(y(x),[x,-min,max]);以下定義了一個函數,並繪出函數的波形圖
y(x):=sin(x)*exp(-x/(2*%pi));
plot2d(y(x),[x,-2*%pi,2*%pi]);