顯示具有 PHP 標籤的文章。 顯示所有文章
顯示具有 PHP 標籤的文章。 顯示所有文章

2022年1月22日 星期六

Tools : 國字加注音小工具

2022年1月22日 星期六

更新說明

如果想使用 2022年底新開發的加注音工具,請點這個連結,開啟較新的文章:


如果仍要使用目前已沒有繼續維護及更新的舊工具,請繼續往下閱讀本篇舊文。

本文開始

昨天第一次體驗到 FB 的「審查」機置!文章中提到我自己架的網站,不過據 FB 的初步審查,它是位於被它列入所謂違反《社群守則》的網域,我試著修改內容,將網址改到自認為程式應該不會認出來的,第三次雖然沒有出現「違反《社群守則》」的警告,成功貼文沒多久,它還是自動被系統移除了。在猜想,圖片中還有網址,根據以前因為 FB 稍有 bug 時,曾經看過,貼文中的圖片,它會分析出圖片中的訊息,人、事、時、地、物......都解析出關鍵字,大概是被它發現還有圖可違反《社群守則》,然後貼文就被移除了。沒關係~反正早有心理準備, FB 的貼文本來就不當它會永久存在。我寫在自己的 Blogger 中,總可以吧!

2014年3月2日 星期日

PHP : smbwebclient.php 增強之二

2014年3月2日 星期日
延續去年底的 smbwebclient.php 增強版,陸續改善及增加了以下幾個地方:

  • smbwebclient.php 操作畫面中的字太小了。
  • smbwebclient.php 的「New File(Upload)」,一次只能上載一個檔案。
  • smbwebclient.php 的「New File(Upload)」,無法使用 Drag & Drop 的方式選檔案。
  • 利用 smbclient 傳遞資料給 SMB 主機時(使用指令 put)並不會保留檔案的 timestamp,也就是檔案的修改日期、時間會變成上載的時間,而非檔案原有的時間。


2014年2月4日 星期二

PHP : file_get_contents 加 HTTP Headers

2014年2月4日 星期二
有個以前可以抓網頁的網站突然抓不到想要的內容,手動在瀏覽器中輸入網址可以看到內容,而以 PHP 的「file_get_contents」卻只出現錯誤訊息,很明顯加了道關卡,一般的方法,不外乎檢查 HTTP Headers:User-Agent、Referer......,以前使用「file_get_contents」都是傻傻的直接呼叫,為了「破關」,這下就得使用更底層的方法囉!

查了 PHP 的參考手冊:

string file_get_contents ( string $filename [, int $flags = 0 [, resource $context [, int $offset = -1 [, int $maxlen = -1 ]]]] )

第三個參數「$context」是關鍵,參考了它的範例,多送出「User-Agent」的 Header ,模擬成人使用瀏覽器來擷取內容的試試:

$url = 'http://xxx.xxx.edu.tw/';

$opts = array(
   'http'=>array(
      'header'=>"User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.9.2.28) Gecko/20120306 Firefox/3.6.28 ( .NET CLR 3.5.30729; .NET4.0E)\r\n"
   )
);

$context = stream_context_create($opts);

$html = file_get_contents($url, false, $context);

試了一下,哈!只用一個「User-Agent」就破關,防禦力太低了!

如果遇到要檢查 Referer 呢?把上面的 header 再加料,餵給 server 就是囉!

$url = 'http://xxx.xxx.edu.tw/';

$referer = 'http://xxx.xxx.edu.tw/rrrrr';

$opts = array(
   'http'=>array(
      'header'=>"User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.9.2.28) Gecko/20120306 Firefox/3.6.28 ( .NET CLR 3.5.30729; .NET4.0E)\r\n"
               ."Referer:".$referer."\r\n"
   )
);

$context = stream_context_create($opts);

$html = file_get_contents($url, false, $context);

如果還需要其它的 HTTP Headers 就繼續加。


2013年12月15日 星期日

PHP : smbwebclient.php 2.9 增強版

2013年12月15日 星期日
如果您的主機只有提供存放網頁服務,卻沒有 FTP 服務可用;又那麼剛好,該主機有提供 Samba 給內部網路連線存取檔案,最最湊巧的是 web server 有 PHP ,這樣,smbwebclient.php 可以是 FTP 的替代方案。

不過,smbwebclient.php 有個不算小的缺點,如果想要 upload 整個資料夾的檔案到主機上,得一個個檔案用滑鼠去點、點、點,應該會加快把手給廢了!

哈!我最近就是遇到這樣的情形,弄得我有一點煩了,於是花了大半天,好好的研究了一下 smbwebclient.php 的程式碼及 smbclient 的參數,將它稍微增強了一下。

2013年9月22日 星期日

PHP : Windows Apache + PHP

2013年9月22日 星期日
忘記是用了哪一個版本的 PHP 起,我 Windows XP 中的 Apache 2.2 就無法載入 PHP 的 module ,這種組合純屬測試,沒得用並不影響,也就沒放在心上。剛剛(其實是兩個小時前),有需要在 Apache 裡跑 PHP ,想說應該難不倒我的,結果研究了半天,唉~電腦的東西日新月異,久沒碰就生疏了啦!其實只是版本的組合選錯了,居然花了我兩個小時!

2012年8月9日 星期四

Blogger : DATA API 擷取 JSON feeds

2012年8月9日 星期四
Google 的服務有一個特點,它有完整的 DATA API ,讓我們可以輕鬆的用喜好的工具開發各式各樣的應用,因此,我們可以讓 Blogger 以 JavaScript 來擷取 Blogger 、Calendar ...... 上的資料,讓它呈現更多樣的風貌。以我用 Blogger 建置的班級網站來說,在首頁顯示「聯絡事項」、「最近行事」...... 就是用這種技巧。

2009年11月10日 星期二

Teaching : 語文高手題庫產生器

2009年11月10日 星期二

▋ 更新說明

如果想使用 2022年底新開發的加注音工具,請點這個連結,開啟較新的文章:


⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ 

~以下為舊文~留存考古用~

⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ 

如果仍要使用目前已沒有繼續維護及更新的舊工具,請繼續往下閱讀本篇舊文。

▋ 本文開始

以前管學校的網路與系統,花了很多時間利用 perl, PHP, ...... 等程式讓自己管理起來更方便。六年前由資訊轉自然科任,之後又回任導師,開始認真的思考如何弄一點東西可以讓學生正向的使用電腦這個工具。因此花了不少時間在 Flash 上面,第一個堪用的作品應該是抽號碼的工具,它最好玩的地方是用了當時我們家唸幼稚園大班的兒子的聲音來報語音,每次要抽號碼時,學生都會指定要我用這個可愛的抽號機。即使不開單槍,他們用耳朵聽語音報號都好。

有一個學期康軒教科書附的國語多媒體光碟有個投籃的 Flash 小遊戲,小朋友還滿喜歡玩的,只是它無法自己新增題庫,因此花了一些時間把它改造了一番(其實只用了它的圖形元件,其它程式都得自己重寫),並將它命名為「語文高手」。

語文高手最大的兩個技術是,它可以讀取題庫的文字檔,並以亂數出題;另外,只要格式正確,可以在國字旁加上注音(這是國語的遊戲的基本需求)。

2008年7月9日 星期三

smbwebclient 網頁版的網路芳鄰

2008年7月9日 星期三
一般安裝完 samba ,套件裡除了伺服器所需的服務程式,還包括了一支叫 smbclient 的程式,它類似對談式的 FTP ,可以讓我們以指令交談的方式來存取網路芳鄰中的資源。這種文字界面的操作方式對一般人來說,可能複雜了一點,因此有人利用 PHP 寫的程式,將 smbclient 的指令用網頁操作的方式包裝起來,讓它成為一個網頁版的網路芳鄰。下面就來簡單的介紹一下這個 smbwebclient 。

由於 smbwebclient 是 PHP + smbclient ,所以,我們的基本需求如下:
  • PHP4 :PHP 4.1.x 以上。
  • smbclient : 建議用 samba3 以後的 smbclient ,之前的版本較無法正確的存取中文檔名。
  • smbwebclient : 可以到原始網站下載 http://smbwebclient.sourceforge.net/
下載回來的 smbwebclient 是一個壓縮檔,裡面只放了一個 PHP 程式,我們只要依自己需求修改完設定,並將它放到可以執行 PHP 的網頁空間中即可。
下面來看看幾個可以設定的地方:
$cfgSambaRoot
這個選項可以讓我們設定認證完以後,網頁中要顯示的預設資源為何。它格式如下:
  • 網域或群組名稱/主機名稱/分享的資源名稱
例如,
  • 想顯示 CC 網域(群組)中的 CCSERVER 所分享出來 share 資源,就設為:
    var $cfgSambaRoot = 'CC/CCSERVER/share';
  • 想顯示 CC 網域(群組)中的 CCSERVER 所分享出來的所資源,就設為:
    var $cfgSambaRoot = 'CC/CCSERVER';
  • 想顯示 CC 網域(群組)中所有的主機,就設為:
    var $cfgSambaRoot = 'CC';
!!要特別注意頭尾絕對不可以加上斜線!!
預設值為空字串,也就是顯示由 $cfgDefaultServer 所指定的主機瀏覽到資源。
$cfgDefaultLanguage
$cfgDefaultCharset
這兩個選項都是用來設定網頁的編碼用的,
因為我們要用 big5 的中文編碼,所以設成:
var $cfgDefaultLanguage = 'big5';
var $cfgDefaultCharset = 'big5';
$cfgDefaultServer
這個選項讓我們設定要以哪一台主機為網路資源的瀏覽器,如果安裝 smbwebclient 的主機本身就有提供 samba 服務,我們可以用預設值的:
var $cfgDefaultServer = 'localhost';

當然也可以換成自己喜好的主機網址。
在 smbclient 的指令中,它是用來放在 -L 後面的主機名稱,例如:
smbclient -L ccserver
$cfgArchiver
smbwebclient 提供一個很方便的功能,它可以讓我們將整個資料夾打包後才下載,這個選項就是用來讓我們設定用那種格式打包,可用的有:
  • tar : 利用 tar 將資料夾打包。
  • tgz : 利用 tar + gzip 打包並壓縮。
  • zip : 利用 tar + zip 打包並壓縮。
預設值是 'zip' ,當然囉!系統裡要先安裝好 zip 的壓縮程式。
smbwebclient 讓我們可以透過網頁來瀏覽或下載網路芳鄰中的資源、上載檔案、開新資料夾,甚至刪除檔案,就如同在 Windows 中以滑鼠操作即可完成。不過方便歸方便,安全問題應該要特別注意。
特別的玩法
如果 server 中裝的 samba 是 2.x 版,又不想動到原有的 samba,怎樣使用 samba3.x 以後的 smbclient 來解決中文檔名的問題?
下面以 FreeBSD 為例,將測試的過程分享一下。
  • 下載適用於該 OS 版本的 samba3.x package
  • 將 smbclient 解出來,執行
    tar zxvf samba3.tgz bin/smbclient
  • 下載適用於該 OS 版本的 openldap22-client package
  • 將 openldap 的 lib 解出來,執行
    tar zxvf openldap22-client.tgz lib
  • 新增解決中文字用的 smb.conf ,放入底下的內容:
    [global]
    mangling method = hash
    dos charset = CP950
    unix charset = CP950
    display charset = CP950
假設整理完的檔案目錄結構如下:
  • /home/test/smb.conf
  • /home/test/smbclient
  • /home/test/lib
我們可以修改 smbwebclient 中 $cfgSmbClient 來指定新版的 smbclient ,並指定 openldap lib 的路徑,讓它可以正常的執行:
var $cfgSmbClient = 'export LD_LIBRARY_PATH=/home/test/lib/;/home/test/smbclient -s /home/test/smb.conf ';
上面的 export LD_LIBRARY_PATH=/home/test/lib/
讓 smbclient 需要 openldap 的 lib 時可以到我們設定的路徑中去找到。
而 smbclient 的 -s 則可以指定要讀取的設定檔路徑。
經過這樣的處理,smbwebclient 就可以利用 samba3 的 smbclient 來正常的存取中文名稱了。


相關文章





2008年5月31日 星期六

以 PHP 讀取 Excel 檔案的資料

2008年5月31日 星期六
在 PHP 中有提供 fgetcsv 和 fputcsv 讓我們讀取 CSV 格式的檔案,以前都是用偷吃步的方式,先將 Excel 檔案另存為 .csv 的格式,再使用前面兩個函數來讀取或輸出檔案,反正 .csv Excel 也可以吃。不過,.csv 中只能存一個工作表,這個應該是一個缺陷。最近正在著手寫一個程式,它必須要能讀取使用者上傳的 Excel 檔案中的資料, google 了一下,原來已經有人寫了一個叫 phpExcelReader 的 class,可以讓我們很方便的讀取任一個工作表。它的網址如下:
該 class 使用的方法可以參考網站下載回來的壓縮檔中的 example.php。
不過我下載回來的 (版本 2007-07-05 19:57),有兩點要注意:
  • reader.php 中的下面這行要修改
    將 require_once 'Spreadsheet/Excel/Reader/OLERead.php';
    改為 require_once 'oleread.inc';
  • example.php 中
    修改 $data->setOutputEncoding('CP1251');
    為 $data->setOutputEncoding('CP950');
    不然中文會有問題。
    修改 $data->read('jxlrwtest.xls');
    為自己的 excel 檔檔名,zip 檔中附的 jxlrwtest.xls 應該是壞了。
用了一下,還滿不錯的!解決了我一個大難題。

試著在不同機器上測試,同一個程式,卻發現有一台機器的輸出有問題,Excel 中的所有中文字都沒讀出來。由於 Excel 的中文是以 'UTF-16LE' 的編碼儲存,所以 phpExcelReader 是利用 php 中的 iconv 來轉碼,而那台機器的 libiconv 版本太舊了,才會無法正常的轉碼。我將 FreeBSD 上的 libiconv 更新為 libiconv-1.11_1,並且重新編譯 php4-iconv 的 ports,安裝完新版的 php4-iconv 後,中文就可以正常的輸出了。

不過,在編譯 php4-iconv 的 ports 時出現了小插曲,原來的 php4 是使用 autoconf253,但是一直出現下面的錯誤訊息:
  • configure: error: tag name "CXX" already exists
試了一下,修改 /usr/ports/Mk/bsd.php.mk 中的下面這行:
  • WANT_AUTOCONF_VER= 253
改成
  • WANT_AUTOCONF_VER= 259
再重新 make 後,總算是把 php-iconv 編譯好。
 
雄::gsyan © 2009. Design by Pocket