Showing posts with label Programming. Show all posts
Showing posts with label Programming. Show all posts

Tuesday, April 29, 2008

php_curl + cookies

curl_setopt($ch, CURLOPT_COOKIEJAR, "d:\Web\PHP\cookieFileName");

很多script會使用cookies,但cookies path最好是full path

Monday, April 28, 2008

PHP5 + Apache2.2 + cURL + windows XP

我用的是PHP Win32 installer,已選好php_curl的設定,但當行script時發現

Fatal error: Call to undefined function: curl_init() in xxxx.php

於是到phpinfo看,curl module沒有load

再看apache的error log

Unable to load dynamic library 'd:\\PHP\\ext\\php_openssl.dll' - The specified module could not be found.\r\n in Unknown on line 0

file明明存在,但就是load不到,所有file都在其位,path variable, php.ini,httd-conf都ok,但就是不行

最後將ssleay32.dll及libeay32.dll放到system32... 就行了

原因不明,path 明明是正確的... 算了,能行就好

Sunday, April 27, 2008

My MingPaoNews

記得大學Year 3時曾上過一個course,名為Information Retrieval,學會編寫網上蜘蛛,因忙著做Final Year Project而沒有放心血下這course的project上,回必一想真是感到有點可惜。

兩三年前,當我還在玩PDA的時候,有網友編了個exe,功能是download 即日Apple Daily同明報,再用ebook工具做成電子書,加上定時功能放到PDA上,那麼每天上班也有新聞可讀。可惜這種program要時常update,網上的報紙要是一改版,program即時報廢。當時心想,不如自己寫一個... 幾年也沒有做出來...

今日,不知為什麼一起床就想去做這個東西,寫了一整天,完成了整個php script。

工作:
到www.mingpaonews.com取得所有headline,
用家選擇若干篇興趣的文章後,再submit即可一次過閱讀所選的文章。

功能:
自動設charset為Big5-HKSCS,不用每頁也要手動轉;
文章的附圖也會貼上,onMouseOver可放大。

限制:
娛樂、財經及賽馬的排版是獨立的,沒有處理它們。

Code:


<?php

function DisplayNewsPage($title,$body,$pic,$pictext)
{
global $base_url;

print '<table border=1><tr><td width=200 VALIGN="top">';
if (is_array($pic))
{
foreach ($pic as $key => $val)
{
print "<img src=\"".$base_url.$val."\" onmouseover=\"popImg(true, this);\" onmouseout=\"popImg(false);\" width=180>"."<BR>\r\n";
print $pictext[$key]."<BR><BR>\r\n";
}
}
print '</td><td VALIGN="top">';
print '<H1>'.$title.'</H1><BR><BR>';
print $body;
print '</td></tr>';
print '</table>';

}

function ProcessNewsPage($url)
{
global $base_url;

$main_content = file_get_contents($base_url.$url);
$pic = "";
$pictext = "";
preg_match_all('|<font size="4" class="txt150" color="#006666">(.*)</font>|U',$main_content, $layer1, PREG_SET_ORDER);

$title = $layer1[0][1];

if (preg_match_all('|<input type="hidden" name="content" value="([^"]*)"|is',$main_content, $layer2, PREG_SET_ORDER))
{
$body = $layer2[0][1];
}

if (preg_match_all("|<font size=2 class='txt150'>(.*)\n.*;javascript:viewlargephoto\('([^']*)'\);|U",$main_content, $layer3, PREG_SET_ORDER))
{
foreach ($layer3 as $val)
{
$pic[] = $val[2];
$pictext[] = $val[1];
}
}

DisplayNewsPage($title,$body,$pic,$pictext);
}

function ProcessPage($name,$url)
{
global $title_keys;
global $base_url;

$main_content = file_get_contents($url);
preg_match_all("|<a[^>]*>(.*)</a>|U",$main_content, $layer1, PREG_SET_ORDER);
foreach($layer1 as $val)
{
if (strstr($val[0],'http')) continue;
if (strstr($val[0],'mailto')) continue;
if (strstr($val[0],'href="#')) continue;

$found = 0;
foreach ($title_keys as $k)
{
if (strstr($val[0],$k))
{
$found = 1;
break;
}
}
if ($found == 1) continue;
if (preg_match_all('|href="([^"]*)"|U',$val[0], $layer2, PREG_SET_ORDER))
{
$a = $layer2[0][1];
if (strstr($val[1],"..."))
{
@$pages[$a]="";
}
else if (@strstr($pages[$a],trim($val[1])))
{
}
else
{
@$pages[$a].=$val[1];
}
}
}

print '<FORM action='.$_SERVER['PHP_SELF'].' method=POST target=_new>';
print '<table border=1><tr>';

print '<td width=100 valign=top>'.$name ."<BR>\n";

print '<INPUT type=SUBMIT value=Submit><INPUT type=RESET>';
print '<INPUT type=HIDDEN name=ShowNews value=1>';
print "<BR>\r\n</td><td valign=top>";
foreach ($pages as $key => $val)
{
print "<INPUT type=CHECKBOX name=$key value=$key>";
print "<a href=".$_SERVER['PHP_SELF']."?ShowNews=1&$key=$key target=_new>$val</a><BR>\n";
}
print '</td></tr></table>';
print '</FORM>';

}

function ProcessAllTitles()
{
global $title_pages_set;
if (!is_array($title_pages_set))
{
echo 'pass 12:00';
return;
}
foreach ($title_pages_set as $key => $val)
{
if (!strstr($val,"main"))
{
ProcessPage($key, $val);
}
}
}

function PrepareTitles()
{
global $title_keys;
global $title_pages_set;
global $today;
global $base_url;
global $main_url;

$title_tag = '<font color="FFFFFF">';
$main_content = file_get_contents($main_url);
$title_pages_set = "";

preg_match_all("|<a[^>]*>(.*)</a>|U",$main_content, $layer1, PREG_SET_ORDER);
foreach($layer1 as $val)
{
if (preg_match_all("|".$title_tag."|U",$val[0], $layer2, PREG_SET_ORDER))
{
$title_pages[$val[0]]=$val[1];
}
}

$removal = array('<font color="FFFFFF">', '</font>');
foreach ($title_pages as $key => $val)
{
$key = preg_replace('| target="[^"]*"|U','',$key);
$new_key = str_replace($removal, "", $key);
$new_val = str_replace($removal, "", $val);

preg_match_all('|href="([^"]*)"|U',$new_key, $layer3, PREG_SET_ORDER);
if (!strstr($layer3[0][1],"http"))
{
$title_keys[] = $layer3[0][1];
$title_pages_set[$new_val] = $base_url.$layer3[0][1];
}
}
}



function PrintJavaScript()
{
print '<script type=\'text/javascript\'>';
print 'function get(eid)';
print '{';
print ' var d = document;';
print ' var r = d.getElementById(eid);';
print ' return r;';
print '}';
print 'function popImg(open, iref)';
print '{';
print ' if (open)';
print ' {';
print ' var top = (iref.offsetParent.offsetParent.offsetTop + iref.offsetTop) + \'px\';';
print ' var curleft = 0;';
print ' var obj = iref;';
print ' do {';
print ' curleft += obj.offsetLeft;';
print ' } while (obj = obj.offsetParent);';
print ' var left = (curleft + iref.offsetWidth )+ \'px\';';
print ' var img = \'<img src="\' + iref.src + \'" />\';';
print ' var d = document;';
print ' if (null == get(\'popImg\'))';
print ' {';
print ' var pop = d.createElement(\'DIV\');';
print ' pop.id = \'popImg\';';
print ' pop.style.position = \'absolute\';';
print ' d.body.appendChild(pop);';
print ' }';
print ' var pop = get(\'popImg\');';
print ' pop.innerHTML = img;';
print ' pop.style.top = top;';
print ' pop.style.left = left;';
print ' pop.style.display = \'block\';';
print ' }';
print ' else';
print ' {';
print ' var pop = get(\'popImg\');';
print ' pop.style.display = \'none\';';
print ' }';
print '}';
print '</script>';
}

function PrepareGlobals()
{
global $HTTP_HEADER;
global $HTTP_FOOTER;

global $today;
global $base_url;
global $main_url;

$HTTP_HEADER = '<html><header><meta http-equiv="Content-Type" content="text/html; charset=Big5-HKSCS"><title>My MingPaoNews</title></header><body>'."\r\n";
$HTTP_FOOTER = "\r\n".'</body></html>'."\r\n" ;

$today = date("Ymd");
$base_url = "http://www.mingpaonews.com/".$today."/";
$main_url = $base_url."main.htm";
}

function DoShowNews()
{
global $HTTP_HEADER;
global $HTTP_FOOTER;

print $HTTP_HEADER;
PrintJavaScript();

foreach($_REQUEST as $key => $value)
{
if ($key == "ShowNews") continue;
ProcessNewsPage($value);
}

print $HTTP_FOOTER;
}

function DoIndex()
{
global $HTTP_HEADER;
global $HTTP_FOOTER;

print $HTTP_HEADER;

PrepareTitles();

ProcessAllTitles();

print $HTTP_FOOTER;

}

// MAIN HERE



PrepareGlobals();

if (isset($_REQUEST['ShowNews']))
{
DoShowNews();
}
else
{
DoIndex();
}


?>

Tuesday, March 25, 2008

我的編程歷史

8歲:父親買了我第一部真正接觸的電腦,為386SX25(以往還有AT/XT機、Apple II等,都沒有真真正正地玩過)
10歲:暑假到元朗大會堂學Logo,就是Turle走來走去的那一個Logo。一般同學畢業前學懂repeat,我學畢後自修學會recusion,還編寫了簡單的作曲function,記得有生日歌、聖誕歌等。
11歲:任天堂末代推出過「家用電腦」軟件連Keyboard,內有Basic的,由於不太出名,reference不足,摸不上手。
12歲:在MSDOS 5.0內玩MS Quick Basic,Programming還是在電腦上做比較好。主要為了修改裡面的猩猩+香蕉遊戲而學的。
14歲:得知上會考班要讀電腦,在暑假自修Pascal,中四上課前寫好了Mastermind,學會了linked list,也就是大學一年級的Introduction to programming的程度吧,因為我是在圖書館借了一本Pascal的教本學的,我記得上面寫住給College First Year收讀,當年以為College就是高中的意思...
15歲:在數學科上學會了Calculus,寫了一些Polynomial四則、D、In的function。同年,在Win 3.1上試學Delphi,失敗了... Event-driven model 還是太新了。
16歲:當大家還沒有在用56k modem的時候,我已經在hkstar上有自己的homepage,是手寫的HTML,對應的是Internet Explorer 3.0及Netvigator Communicator 3.5。由於hkstar上不能行script,只好用外國的message board,不然已經給自己編了一個Blog...
17歲:DHTML時代,接觸java、ActiveX等,成立Blog型式的homepage,但還要手動加post的,所以一直都沒有加新文章入內。當年的筆記上,還寫著「public static void main <--???????????????」。
18歲:升大學的暑假,除了做暑期工外就沒其他事做,學會了Visual C,更寫了第一隻DirectX Game,是一個scriptable的plane shooting遊戲,對應的是VC6+Dx7。
19歲:偶然見到同學拿著一本「手機鈴聲大全」,裡面全是鈴聲code... 而且Nokia、Ericsson和Motor等的code都不同的,突發奇想,寫了第一個MFC的program,就是Mobile Phone Song Player,除了能翻譯各機的code外,還可midi發聲及output midi file的。不知為何會有人知道有這個作品的存在,有當時的大鈴聲網站link到我的作品處,介紹說:「這可是香港人的作品!」,下載次數高達5位數... 當年還只是一個year 1的大學生...
21歲:畢業作品為波子棋的AI研究,寫了一個Windows(Doc/View Framework)的client,除了可以和AI對戰,還可以網絡IP對戰,而且有chat room功能呢。
22歲:為給女朋友做生日禮物,學會了Flash,寫了一張Interactive的生日卡,用的還是ActionScript 1.0,還沒有class的概念。
23歲:參加了ACM Online Programming Contest,有興趣可以去看看 Valladolid Online Judge,活躍了一兩年,解決近150題。其中有一題有關 15-puzzle的題目,論速度、論內存,當年還是世界第一呢!
24歲:從事數學教育工作,為工作寫了很多教學上的小幫手,除了offline的「出題機」外,還有一些帶到堂上使用的PocketPC工具,成為我上課不可缺少的一部份。代表作為「24計算」及「火柴遊戲」。
26歲:真真正正成為一名全職的Software Engineer,接觸到的可多了... C/C++/Java/PHP/Blackberry Java/Symbian C++/Mac Cocoa (Objective C) ... 未能盡錄...

Wednesday, March 12, 2008

New Project with C# 2008 + .Net 3.5

學習Visual C,以VS6開始,都差不多十年。陪著我走的有VS6, VS.Net, VS 2003, VS 2005,雖然沒有什麼大作,但過程中包括了Game, Midi, MFC, Network, AI, Mobile等多方面的知識。

去年 1 1月,因工作關係接觸了C#,寫了有關Office plug-in的tech demo,進一步理解什麼是「與時並進」,從前的基礎很重要,新的語言也要好好學習,不然就會好像公司近來interview的求職者一樣,不能達到現今的要求。

所以今天開始,要好好學習,最有效的方法就是切實地去完成一個Product。一直都想更新以前的ChineseCheckers2,今次就以Visual C# 2008,編寫我的ChineseCheckers3。