2016年11月30日 星期三

PHP Warning: Header may not contain more than a single header, new line detected in xxxx.php on line xxx 解決方法

剛剛收到一個回覆,運作很久的程式忽然無法動了,看了一下error log 出現以下錯誤
PHP Warning: Header may not contain more than a single header, new line detected in xxxx.php on line xxx

google了很久,抓不到原因,字面上是說你有太多header在運作,但是我把所有header都刪掉了,只剩一個還是出現這個錯誤,後來終於google到一篇,是因為我用header location進行轉址,但是轉址過去的url變數含有換行符號,所以把換行符號過濾掉即可

$url = preg_replace('/\s+/', '', $url);

參考資料:

2016年10月7日 星期五

windows 下使用 bat 指令 auto commit 到 github

最近因為 dropbox 把 public folder 關了,讓我的一個小程式沒辦法再透過html網頁查詢使用情形,只好轉戰 github,不過在 auto commit 時遇到不少問題,特此紀錄一下

我安裝了 github for windows,實在有點討厭這麼肥的程式(3xx MB),不過他也是有好處的,就是自帶了一個git-shell...會自動login...

我研究了很久如何在 windows 底下使用 bat 指令進行 auto commit,但是都會卡在要求帳號密碼的地方,網路上一堆人教如何跳過帳號密碼輸入
使用window認證管理員,還要再安裝一個2xx MB的程式,太誇張,不爽裝,失敗
使用記憶密碼 store,失敗
使用id & pw in url,失敗
使用ssh key,還是失敗

花了很多時間研究到底哪裡出錯,後來終於想到 使用 git-shell 就能跳過輸入帳號密碼的部分了阿...

1. 安裝肥大的github for windows
2. 使用github for windows 把專案下載下來,此時程式會自動建立你的ssh key
3. 確認一下 git-shell 是否可以自動登入
4. 找出 git-bash.exe 這支程式的位置 (c:\user\applocal\local\xxxxxxxxxx)
5. 建立 git_auto_commit.bat 內容如下 code_folder位置改成存放git_commit.sh的位置
@ECHO on
cd /d CODE_FOLDER

C:\github\git-bash.exe ./git_commit.sh
6.建立 git_commit.sh 內容如下 project_folder改為專案資料夾的位置
#!/bin/sh
timestr=$(date +"%Y-%m-%d %T")
cd PROJECT_FOLDER
git add . #加入所有新增檔案
git commit -m "Automated commit on $timestr" #快速commit
git push

這樣 執行git_auto_commit.bat 他就會自動呼叫 git-shell 執行 git_commit.sh 的腳本,因為git-shell已經登入,所以不會再跟你要帳號密碼

2016年7月29日 星期五

Windows 10 VPN斷線自動重撥解決方案

Windows自帶pptp的VPN連線方式,不用安裝任何軟體就可以使用VPN連線,但是從8.1開始,居然把斷線自動重撥的功能拿掉了...

還好有變通方法可以使用...不過有點麻煩...就是使用工作排程器,偵測斷線的事件20226 & 重撥失敗的事件20227

1. 使用工作排程器,新增一個工作
2. 觸發程序 選擇 當事件發生時
3. 紀錄檔 選擇 應用程式
4. 來源 RasClient
5. 識別碼 20226
6. 再新增一個觸發程序 識別碼 20227
7. 動作 新增一個 啟動程式  指令碼填 rasdial
8. 引數填 "VPN_NAME" id pw
9. 完成

這樣就能夠自動斷線重連了(手動斷線不會)

嫌麻煩也可以利用以下的XML檔匯入...VPN_NAME記得修改

<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Date>2016-07-29T14:52:44.5247799</Date>
    <Author>DESKTOP-LABE5JE\jikker</Author>
    <URI>\VPN</URI>
  </RegistrationInfo>
  <Triggers>
    <EventTrigger>
      <Enabled>true</Enabled>
      <Subscription>&lt;QueryList&gt;&lt;Query Id="0" Path="Application"&gt;&lt;Select Path="Application"&gt;*[System[Provider[@Name='RasClient'] and EventID=20226]]&lt;/Select&gt;&lt;/Query&gt;&lt;/QueryList&gt;</Subscription>
    </EventTrigger>
    <EventTrigger>
      <Enabled>true</Enabled>
      <Subscription>&lt;QueryList&gt;&lt;Query Id="0" Path="Application"&gt;&lt;Select Path="Application"&gt;*[System[Provider[@Name='RasClient'] and EventID=20227]]&lt;/Select&gt;&lt;/Query&gt;&lt;/QueryList&gt;</Subscription>
    </EventTrigger>
  </Triggers>
  <Principals>
    <Principal id="Author">
      <UserId>S-1-5-21-687921218-3904265620-350331364-1001</UserId>
      <LogonType>InteractiveToken</LogonType>
      <RunLevel>LeastPrivilege</RunLevel>
    </Principal>
  </Principals>
  <Settings>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>false</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
    <IdleSettings>
      <StopOnIdleEnd>true</StopOnIdleEnd>
      <RestartOnIdle>false</RestartOnIdle>
    </IdleSettings>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>false</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <WakeToRun>false</WakeToRun>
    <ExecutionTimeLimit>P1D</ExecutionTimeLimit>
    <Priority>7</Priority>
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>rasdial</Command>
      <Arguments>"VPN_NAME" id pw</Arguments>
    </Exec>
  </Actions>
</Task>

2016年5月16日 星期一

煩人的高鐵網站時刻表&行車時間計算機


因為高鐵現在班次很多又複雜,北高直達的班次又變少,每次要上高鐵網站查詢要搭哪班車,就得計算這班車到底要開多久,一怒之下寫了以下的程式碼,會自動計算行車時間,就是在以下這個畫面執行的時候會把那完全沒用的備註欄改為行車時間。

BTW,購票頁面有行車時間,這頁就沒有,看來(準備)付錢的就是老大阿...



使用方法
1.把 高鐵時間計算機 這串文字拉到我的最愛(Chrome or Firefox, IE管他去死)
2.查詢高鐵的時候按一下那個書籤,可愛的行車時間就跑出來了

以下是未經壓縮的原始碼

var i=1;
$('.column3').each(function(){
var date = $('#SearchDate').val();
var start = $('.column3:eq('+i+')').text();
var end = $('.column4:eq('+i+')').text();
var s_time = new Date(date + ' ' + start);
var e_time = new Date(date + ' ' + end);
var run_time = (e_time-s_time)/1000/60;
var last = run_time % 60;
var run_time_str = '';
if(last < 10){
last = '0'+last;
}
if( run_time <= 60){
run_time_str = '0:'+ last;
}else{
run_time_str = Math.floor(run_time/60) + ':' + last;
}
$('.column2:eq('+i+')').text(run_time_str);
$('.column2:eq(0)').text('行車時間');
i++;
});


某遊戲網頁領取獎勵語法

懶的手動領

button1: javascript:name=prompt("角色名稱","");$("#txtCharName").val(name);$("#RBServerList_7").attr("checked", true);$("#ibtnNext").click();

button2: javascript:$("#rdoBox20").attr("checked", true);$("#CheckBuy1").click();

2014年3月19日 星期三

Google Apps Script使用心得

之前就有聽過google apps script能夠讓你自行撰寫程式碼,然後在google的次服器上執行,有人拿他來做監測伺服器運作是否正常的工具,有人拿來架設簡易的Web Server

前陣子我弄了一個google表單,要統計一些數據,我希望有人回覆表單的時候我能收到mail通知,所以就研究了一下FormEmailer,他可以幫我達到這個功能。

然後手上剛好接到一個案子,要寫一個盤點系統,因為有一些需求,所以我決定用google drive的試算表+google apps script來完成,會採用這種架構的主要原因是跨平台+省去UI開發,而且不用伺服器24小時運作。整個系統完成的時間大概花我一個半月吧,弄完之後有點小心得跟大家分享。

  1. 語法方面:基於javascript上的script語法,寫起來跟寫javascript沒啥差別,一切javascript的function都可以用,不過官方編輯器會有比較嚴謹的要求,例如:變數必須先宣告。
  2. 速度方面:這就是非常重要的一點了,google apps script跑起來,非常慢...,慢到什麼程度? 複製一個試算表,再改點權限,寫幾個值進去該表,可能要花10秒鐘左右。10秒鐘聽起來還好,不過檔案一多時間就變超久了,而且他有每次最大執行時間6分鐘的限制,執行超過6分鐘的function會被強制中斷,我怎麼知道我的程式跑起來會不會超過6分鐘? 被中斷之後你就知道了 XD
  3. 除錯方面:官方的編輯器有點難用,雖然提供了簡單的function提醒功能,也有debug功能,但是他的debug功能速度慢也就算了,居然沒辦法debug UI的event function,我google之後有人說善用Logger,但是Log根本沒辦法紀錄全部的東西啊...
  4. Log方面:說到log,我們當然希望他越詳盡越好,但是他的log只會提供最後一次的執行log,有時候根本不敷使用,我最後自己寫了一個log系統,把要紀錄的東西另外塞到別的試算表內...
  5. 穩定性方面:別懷疑,執行程式時的穩定性不好,這一個半月下來,大概2~3天會接到一次通知程式執行失敗的mail,所以你的程式要設計的非常有容錯能力,要可以檢查上次是否執行成功,如果失敗了要接下去跑,然後把執行次數多設幾次這樣才能確保程式都有跑完
  6. 計算額度方面:google apps script有提供每天的免費計算額度,例如:個人用戶1天1小時的計算時間,每天可以發出的200封Mail...等,可是他沒有一個介面讓你知道你今天的扣打剩多少了,只說會在接近上限時通知你,這有點麻煩,最後我還是自己寫了一個表,自動統計所有的function到底運算多少時間。
  7. API支援方面:開發這個系統時我用到大量的試算表,google drive有非常完善的權限控管功能,可以透過API任意新增或減少使用者,試算表也有類似的功能可以設定保護工作表,但是,保護儲存格範圍目前沒有相關的API,所以沒辦法用API去設定保護儲存格!!!!!,最後我的解法是把所有重要的資料都集中到某個工作表,然後保護該工作表....
  8. ImportRange功能:ImportRange可以讓你載入某個檔案的某部份資料進來,非常好用,但是如果import的層數一多,例如:載入A檔案的B資料,再用B資料去載入C資料,再用C資料去載入D資料,這樣一連串的載入之後速度就會變得非常慢....,大概超過3層以上的載入有時還會失敗,我的解法是把已經固定下來的載入資料直接寫入檔案,不讓他再去載入,這樣速度會快很多。
  9. 驗證資料功能:千萬別開啟驗證資料失敗後拒絕輸入的功能,請開顯示警告,你然你會發現,應該可以寫入的數值被莫名其妙的拒絕了,這一開始困擾我很久,還以為是我寫錯了,後來證實是他的bug...
  10. OnOpen function不執行的問題:所有script專案都會掛一個OnOpen的event,不過有時候他就是莫名其妙不會執行,答案是,你所有運算都要包在function裡面,不然就會造成這個錯誤,例如:
    
    var a = new Date();
    function OnOpen(){
        ...
    }
    

    這樣就會出錯了,建議解法是不要使用全域變數,或是自己再掛一個OnOpen的event上去就可以了
  11. 使用者資料讀取問題:剛剛提到google drive的權限控管很好用,他提供addEditor(emailAddress)、removeEditor(emailAddress)、getEmail()等function,讓你可以使用對方的email就可以快速刪改權限,爸特!,就是這個getEmail(),他有陷阱存在,他是去抓google plus的資料,所以如果對方沒有開放google plus的資料給人家看,那你就永遠抓不到他的email,會陷入可以用email加權限但是你不知道要怎樣砍他權限的問題...,解法是...乖乖開放你的email給朋友讀取吧....
  12. 讀取資料問題:一次讀取某個範圍的資料跟一次讀取一格資料所需的時間差不多,所以可以的話就一次讀出一堆資料再來處理,寫入也是一樣,反正記憶體不算在使用額度內 XD
綜合以上幾點,要用google apps script開發中小型軟體系統,最好考慮到未來擴充性的問題,因為每個帳號每天有扣打限制,所以要設計的有平行處理的功能,因為穩定性問題,要考慮接續上一次處理進度的問題,這樣才能避免程式運作不順利。

一次寫了這麼多好像都在抱怨google apps script的缺點 XD,不過這都是我開發過程中的心得,事實上,使用google apps script開發這個專案幫我省下了UI開發時間、權限控管問題,安全性問題,跨平台問題,資料同步問題,重要的是還不必有一台伺服器24小時運作。

希望大家開發google apps script順利 :)

2014年1月29日 星期三

Android抓不到WiFi SSID

之前把一台用不到的無線AP架在我房間內,想讓手機跟iPad都可以無線上網,但是很奇怪的事情發生了,我的Android手機居然抓不到WiFi的SSID,但是iPad跟iPhone都可以,google也找不到原因,後來就懶得理他了,反正我的手機有3G吃到飽。

但是最近忽然心血來潮把那台AP刷了最新版的dd-wrt,就抓的到了,可是我做了一些調整之後,又發現抓不到了!!!居然是設定的問題,所以我就開始檢查到底是什麼設定出問題,結果發現,是頻率不能調自動,我把頻率固定在頻道6就能夠抓到了~~~