顯示具有 程式 標籤的文章。 顯示所有文章
顯示具有 程式 標籤的文章。 顯示所有文章

2022年8月3日 星期三

從svn跳槽到git繼續使用數字版號

 最近要被強迫從 svn 的版控系統改為由 git 控制版本,因為習慣SVN的數字版號了,很明顯就能看出哪個版本比較新, git 的亂數版號就完全搞不清楚到底哪個版本比較新了,所以決定找出在 git 也能用數字版號的方法,google了一下發現 git 有這個指令

git rev-list HEAD

使用這個指令會列出目前所有的亂數版號,push 過幾次就有幾個,就只要計算有幾行就能轉換成數字版號了

我用來編寫版本的程式長這樣

version.php 

<?php
return[
'date'      =>'$Date: 2022-08-03 15:12:13 +0800 (週三, 03 八月 2022) $',
'build'     =>'$Rev: 101 $'
]; 
// 2022/08/03 14:49:16.91 

以往只要寫程式 更改 最下面那行的時間,commit時,svn 會幫忙更改 $Date跟 $Rev,現在改由bat檔幫忙計算後填入,程式如下

version.bat 

@echo off
::計算git push次數
FOR /F "tokens=1" %%a in ('git rev-list HEAD ^| find /v /c ""') do set /a veri=%%a+1
set x=version.php
:: 刪除 build 那行
findstr /v "build" %x% > temp
type temp > %x%
:: 刪除有 // 的那行
findstr /v "^//" %x% > temp2
type temp2 > %x%
:: 刪除 ]; 那行
findstr /v "^];" %x% > temp3
type temp3 > %x%
:: 清空多餘變數
del /f temp
del /f temp2
del /f temp3
:: 填回build+Rev
@echo 'build'     =^>'^$Rev^: %veri% ^$' >> %x%
:: 填回];
@echo ]; >> %x%
:: 填回時間
@echo // %date% %time% >> %x%

2011年1月27日 星期四

計算php運算時間ms等級

想要計算一個php頁面運算到底要多久可以在程式一開始時呼叫time function,運算結束後再呼叫一次,計算2次的時間差,不過time的等級只到秒,如果算的東西很少,可能得到的結果為0秒


下面程式可以計算頁面運算速度到ms等級

2011年1月19日 星期三

PHP Fatal error: Out of memory 解決方式!!

標題好像下的很聳動 XD

今天在聊天的時候遇到有人跟我聊到他的程式會跑出Out of memory的狀況,明明記憶體已經給很大了,還是會這樣。

我之前也常遇到這個狀況,後來發現是轉換文字編碼的function作怪,只要有用到iconv, mb_xxx,這類的文字編碼function就要小心了,因為這類function非常吃記憶體,我之前估算記憶體用量約為被轉換資料的10倍左右,也就是如果你轉1m的資料,他要跟你要10m的記憶體,如果轉10m他就要100m的記憶體,一般人開給apache的記憶體用量通常不會這麼大,這時就會出錯拉~~~

PHP CLI模式下變數取得方式

什麼是CLI,全名是Command Line Interface,再不懂請自己google。

php不知道多少後開始支援這個,那也不是重點,反正這篇要教的是如何在CLI模式下拿到變數,答案就是使用$argv變數。

在下command line的時候如果是這樣下的
php test.php aa bb cc

2011年1月5日 星期三

php function 隱藏參數寫法

我也不知道這東西正式名稱叫什麼XD
反正就是讓你寫的function可以不必每次帶一堆用不到的參數
正常的function寫法是這樣
function test($a,$b,$c){
//do something
}

2010年12月21日 星期二

IE8底下submit出現網頁過期解決方式

最近弄的東西出現了莫名其妙的bug,form送出的時候會出現網頁已過期,但是在chrome、firefox底下又很正常,而且我自己電腦的IE8不會有這個問題,別人的才會,一開始以為是jQuery的問題,google了半天也沒出現過結果。被這個bug困擾好久,後來靈光一閃,發現原來是這個問題

2010年11月10日 星期三

php上處理utf-16le檔案

最近要在php上讀取excel的檔案,因此有去找一些相關套件以及一些用法,因為要處理的檔案可能會有多國語言問題,所以一開始就規畫要用utf-8來編輯。

1. php excel reader
 這套件讀取excel很方便,但是不支援unicode,失敗。
2. php excel
這套件支援unicode,也不是很複雜,照理說應該用他,不過這東西可能裡面沒寫好,處理個2mb的excel檔,居然要吃掉256mb左右的記憶體,哪來這麼多記憶體給他吃,失敗。

後來就想說不然從CSV格式著手,結果excel輸出CSV不支援unicode,失敗
再來就試輸出成unicode的txt檔案,有成功,沒變亂碼,但是這是utf-16le的編碼,不是utf-8。

我很天真的想說,既然檔案是utf-16le,我以後要輸出的格式也是要utf-16le才能讓excel正確讀取,所以我乾脆整個網站架構改成utf-16le吧,反正瀏覽器支援讀取各式各樣編碼,但帶計膜架甘丹。

因為我採用lamp架構,但是php 5 &mysql 5.5都不支援utf-16,雖然有找出真的能在php上使用utf-16編碼的code,不過只有firefox上能正確顯示,IE上就掛了,所以別天真的想說弄個utf-16架構的網站,這大概只有純html才能辦的到。


確定網站端還是只能用utf-8之後,表示使用者丟utf-16le的檔案上來,我們要轉成utf-8在網站上處理,處理完後再轉成utf-16le回去給他,所以就是要處理utf-8 <=> utf-16le的問題了

上網google了很久,一堆說什麼使用iconv, mb_convert_encoding,utf8_encode,utf16_decode...之類的function,全部失敗,甚至還有人寫一大串在處理0xff, 0xfe之類的東西,但是一樣全部陣亡,根本沒一樣能跑出正常的東西,後來我乾脆把檔案直接用16進位方式打開,直接去看我的程式轉出來的東西跟轉檔程式跑的到底差在哪,看完之後發現檔頭都少人家2個byte,原來是該死的BOM,後來手動在要轉成utf-16的檔案上加上BOM就沒問題了。

只有utf-8允許可以沒有bom,utf-16, utf-32都是一定要有bom的,因為牽涉到little endian跟big endian的問題。
以下是我的code

function utf8_to_utf16($utf8_filename,$utf16_filename){
    $file = fopen($utf8_filename,"r");
    $write = fopen($utf16_filename,"w+");
    if($file){
        $buffer=chr(255).chr(254); //加入BOM
        fwrite($write,$buffer);
        while(($buffer = fgets($file)) != false){
            $buffer=iconv('UTF-8','UTF-16LE',$buffer);
            fwrite($write,$buffer);
        }
    }
}

function utf16_to_utf8($utf16_filename,$utf8_filename){
    $write = fopen($utf8_filename,"w+");
    $buffer=mb_convert_encoding(  file_get_contents( $utf16_filename ), 'UTF-8', 'UTF-16LE' );
    fwrite($write,$buffer);
}
為什麼2種轉法不一樣呢?
因為utf-8轉utf-16時會佔用比較多的記憶體,一次轉的話容易造成記憶體不足,所以分行轉,utf-16就沒這個問題,此外utf-8轉utf-16花的時間也比utf-16轉utf-8多,我測試轉一個12m的檔案,8轉16要花23秒,16轉8只要1秒...

另外,用這個方式轉出來的utf-8是有bom的,要去除的話請自己來 XD

2010年10月27日 星期三

解決header產生的warning: Cannot add header information - headers already sent in...

很早以前我就常用header這個指令來轉頁面,不過使用這個指令有個限制,就是在前面不能輸出任何東西,就算一個空白也不行,不然會出現

 warning: Cannot add header information - headers already sent in...

我一直以為這是個function的限制,就像125cc再怎麼會跑還是不能上高速公路一樣,結果那天一google之後發現,原來他是可以解決的...

只要把php.ini中的output_buffering打開,或者是隨便給個值,就算在header前有任何輸出,也不影響它的功能了,不過要注意的是,我在使用的時候通常是因為程式有錯誤,才會在header前輸出東西,把這功能打開以後,你看不到任何錯誤,因為頁面已經被轉走啦~~~

Parent: child process exited with status 255 -- Restarting

最近在碰PDO(PHP Data Object),說時在這東西實在很難用,比我愛用的ezSQL難用多了,但是為了防止SQL injection攻擊,只好用這一套,這不是重點XD,重點在於我那天再使用的時候忽然發現,在select資料的時候apache會被關掉,insert不會,只有select的時候才會,不知道是啥鬼狀況,log裡面就只出現這行

Parent: child process exited with status 255 -- Restarting

膜拜了很久的google大神之後才發現這篇,上面提到這是xampp 1.70在windows上(?)的錯誤,修正方法如下

Problem solved. Turns out this is a bug in XAMPP 1.7.0 PHP and the fix is already there.
To fix the problem:
in "xampp\apache\bin"
copy libmysql_5.0.51a.dll libmysql.dll
in "xampp\php"
copy libmysql_5.0.51a.dll libmysql.dll
in "xampp\php\ext"
copy php_mysql_5.0.51a.dll php_mysql.dll
copy php_mysqli_5.0.51a.dll php_mysqli.dll
弄好之後就正常了...

2010年9月17日 星期五

按鍵精靈程式心得

1. 沒有break 只有 exit for , exit if exit do,也沒有exit while....瞧不起while就是了
2.函式回傳可以用 x=plugin.xxxx.xx
3.date指令很難用,可用Plugin.Sys.GetDateTime()代替會回傳 year-mon-day H:m:s
4.自定義變數前後都要用"框住
5.while結束指令是wend 不是{ }
6.for結束指令是next,if是end if
7.do while指令用法是 do while ... 不是 do ... while
8.網頁插件指令,會等到網頁完全載入才動作(?),載入太久該動作會被放棄(?),反正就是指令好像沒執行就跳下一行

2009年2月22日 星期日

php日期相減

在php中想要計算兩個日期之間的差距,可不能用$A-$B來做,需要透過strtotime函數將時間轉成UNIX時間標記,UNIX時間標記就是從1970年1月1日(?)開始到現在的秒數總和,透過將兩個時間轉換成UNIX時間標記之後,計算之間相差幾秒,就可以算出兩個日期是相差幾天幾時幾分幾秒。

##CONTINUE##

google了一下,發現strtotime真是個很好很強大的function,顧名思義它就是將字串轉換成時間標記的函數,只是他能處理的字串類別真的是有點多…例如:

echo strtotime("now");
echo strtotime("10 September 2000");
echo strtotime("+1 day");
echo strtotime("+1 week");
echo strtotime("+1 week 2 days 4 hours 2 seconds");
echo strtotime("next Thursday");
echo strtotime("last Monday");

也可以直接使用strtotime(“2009-01-01”),總之,真是很好很強大的函數啊…

資料來源:http://tw.php.net/strtotime

2008年7月23日 星期三

BCB6 ListBox用法

紀錄一下

想抓到ListBox中被選中的item名稱,寫法如下

ListBox1->Items->Strings[i]

另外 想知道被選中的item index的話是

ListBox1->ItemIndex

2008年4月8日 星期二

C++ extern 全域變數正確用法

在c++中,若要使用全域變數需加上extern這個宣告,例如

extern int i;

但是使用這個變數還有一些小小的限制必須要注意

嚴格來說extern並不算是一個完整的全域變數宣告,他比較像標記,在.h檔內標記變數為全域變數,但是還要在cpp檔中重新定一變數一次

這邊要說的是,當你在unit2.h當中宣告了

extern int i;

這時候還必須在unit2.cpp中重新定義

int i;

要注意的是一定要配合.h檔,在相同名稱的.cpp內重新定義,不然會出現linker error

寫得很亂,隨便啦,反正就是說要配合.h去做全域變數的宣告而已

2008年3月6日 星期四

在jQuery上確認radio是否被選取

在jquery上並不能像javascript一樣使用.checked=true來判斷radio元件是否被選取,而且他本身的說明也沒說有任何function可以應用。

剛剛找了一個下午的解決方法,發現要配合.is這個function,整個寫起來就是
  • $("input[@type=radio].is(":checked")")
但是如果一開始就是想選擇已經被選中的元件就不必這麼麻煩,直接使用
  • $("input[@type=radio][@checked]")
即可

2011/05/15 update

@選取法已不能用,要改為

  • $('input:radio:checked[name="abc"]')

2008年1月15日 星期二

網頁離開頁面跳出確認視窗(by jQuery)

  有在使用Gmail的人應該都知道,在撰寫郵件時有個貼心的小功能會在你尚未編輯完成,但卻按其他的超連結或關閉視窗時,會跳出一個小視窗提醒你要離開此頁面,資料會消失,這個貼心的小功能其實很簡單就能完成唷。


##CONTINUE##  這個功能是使用Windows.OnBeforeUnLoad這個函數完成的,jQuery也有提供關於這個變數的用法,而且應用jQuery的其他語法,可以做到頁面有變更的時候才挑出這個視窗提醒唷。

var modified = false;
$(document).ready(function() {
$("input,select,textarea").change( function() {
modified = true;
});
});

window.onbeforeunload = function confirmExit(){
if (modified)
return '有尚未儲存的資料,確定要離開嗎?'; //自訂提示
}
  接下來只需要在送出時把modified宣告為fals,這樣在送出時就不會跳出是否要離開的頁面了,不過這個缺點是,只能自訂圖片中紅色區域的字樣,無法像Gmail一樣,完全跳出自訂的視窗。

2008年1月8日 星期二

使用php透過Gmail發信

  要使用php讓網站也能寄信,要設定一堆有的沒有的設定,有的還要自己架Mail Server這實在太麻煩了,讓這一切透過Google大神幫我們搞定吧

  不過Google大神是使用SSL這種安全性加密技術來接收郵件的,這對某些php程式可能會水土不服,沒關係,這點小問題膜拜一下Google大神,很容易就解決了

##CONTINUE##  Google大神告訴我這篇文章有我想要的答案,不過這篇文章年代可能有點久遠囉,有些地方有小錯誤,讓我指正他一下 XD
  1. phpmailer出到2.0x囉,1.73實在是太老了點,如果在2.00版本的話,class.phpmailer.php這個檔案應該是在587行插入
    //Modify by Fwolf @ 2006-4-14, to enable ssl mail connection $host = $this->Host;
    $port = $this->Port;
    而不是在544行,另外在class.smtp.php則是不用做任何修改,因為它已經幫你改好了
  2. 由於Gmail寄信是用SSL協定,所以根據http://tw2.php.net/manual/en/ref.openssl.php的說法,要讓PHP的openssl啟動,需要複製ssleay32.dll 及 libeay32.dll 到system目錄,然後將php.ini中的openssl註解取消。如此,PHP便能支援openssl。
    這邊的說法也錯了ssleay32.dll與libeay32.dll是要複製到windows下的system32資料夾下,而不是system資料夾
  另外需要注意的是,如果你安裝的是XAMPP的話,php.ini是要去apache/bin底下找,千萬別呆呆的學我改php資料夾下的php.ini =.=,還有如果你有成功開啟openssl服務的話,在phpinfo頁面中應該可以看到以下畫面,若沒看到就是開啟失敗囉...


  幫大家一個忙
  引申閱讀:

2007年8月5日 星期日

php時間錯亂問題

  php5.1版以後將時區預設為GMT,所以在使用時間函數時會產生時間少8小時的錯誤,剛剛在google大神上面找解決方式,但是大家都教到php.ini中找
;default.timezone =
將它改成
default.timezone = Asia/Taipei
##CONTINUE##
  但是根據我的使用結果無效,很怪、非常怪,我記得以前也這樣改過然後有成功...,不過總而言之,這次失敗了,最後不得已只好採用第二種消極的方法,在所有用到時間的地方加入
date_default_timezone_set('Asia/Taipei');

強制把時間設定為GMT+8,改天找到解答在po上來

2007年7月5日 星期四

洗衣管理系統進度表

洗衣管理系統進度表 2007-07-31

已完成

  1. 7/2 完成資料庫初步設定
  2. 7/4 完成新增/刪除管理者功能
  3. 7/5 完成物件系統初步功能
  4. 物件系統資料庫新增"燙"欄位
  5. 資料庫編碼改回latin1_swedish_ci
  6. 登入系統做部分修正
  7. CSS檔案合併
  8. 7/31 完成櫃檯系統
  9. 7/31 完成搜尋系統
  10. 7/31 會員系統部分完成
  11. 7/31 資料庫新增pattern_list資料表,儲存衣物花樣
  12. 7/31 完成花樣管理系統
  13. 7/31 收件系統完成Ajax部分
##CONTINUE##
未完成

  1. 登入系統安全性規劃
  2. 編輯管理者功能
  3. 交易系統
    • 高優先
  4. 會員管理系統
    • 優先

  5. 版面美化
  6. 整體系統安全性設定
  7. 整體程式整合規劃
  8. 系統備份程式
    • 低優先
  9. more...


程式完成度:30%.....

2007年5月31日 星期四

謎之物開發

嘿嘿...這是個謎之物,因為感覺某網站太麻煩而
設計的,功能尚未完全,偶爾無聊才會開出來寫一下,但大部分功能都有囉!!



耶~這是啥!?
##CONTINUE##

迷之頁面!?


迷之頁面執行結果


迷之設定...