Delphi 的PAServer(Platform Assistant Server)是一個可跨平台的程式。一般安裝的是mac上面的pkg版本,但是有網友在問setup_paserver_upd1.exe 的版本作用是什麼?
這個版本是提供在32位元開發的朋友,如果要編譯成64位元版本時,可以在64位元的電腦上安裝paserver。接著透過連線的方式,將程式碼complier到64位元的windows環境。
大型網站架構..net 架構師.rabbitMQ.redis.行動開發.APP開發教學.PHP Laravel開發..net core C# 開發.架構師之路.Delphi開發.資料庫程式.進銷存.餐飲POS系統
Delphi 的PAServer(Platform Assistant Server)是一個可跨平台的程式。一般安裝的是mac上面的pkg版本,但是有網友在問setup_paserver_upd1.exe 的版本作用是什麼?
這個版本是提供在32位元開發的朋友,如果要編譯成64位元版本時,可以在64位元的電腦上安裝paserver。接著透過連線的方式,將程式碼complier到64位元的windows環境。
今年政府允許了玉山銀行與大陸最大的第三方支付「支付寶」合作後,就協助做與店家串接服務的工作。
一開始就把它當做是信用卡、悠遊卡、一卡通、ePay這類的服務做串接,倒也還好,只是介接支付寶到後面發現奇摩子很不爽…….
整個介接過程一直被當合作伙伴(ㄅㄞˊㄌㄠˇㄕㄨˇ),為什麼知道呢?因為每次介接程式做好要測試,就發現它們的DEV環境又修改了東西。然後出現了各式錯誤訊息~接著就要寫信給工程師等待回應。


昨天開始正式環境時,又出現了相關的訊息~眼尖會發現系統是接收sdk所回傳的訊息。不過突然玉山竟然說是程式的問題~因為不相信之前測試完成是有問題的,就請對方把當初的測試機搬上去,測試後發現測試機沒問題,正式機有問題後,這下就知道問題不在程式了。接著回應是
13:33 玉 SRY,目前這個Config檔,仍然是先連線到測試機 13:35 玉 我們正式環境的LOAD BANANCE主機,今天還在調整 13:35 玉 問到了,DEV(測試機)工程師今天有動到資料庫 13:36 玉 剛剛的ERROR應該是Mapping不到,造成初始化失敗
一開始覺得還好,不過人真的很重視的是奇摩子。尤其是一開始被咬定是程式問題時~就覺得超級不爽



一卡通(iPASS)是與悠遊卡(EasyCard)都是台灣的電子票證智慧卡,二者都是使用RFID(菲利浦的MIFARE)技術。今天來分享大致的技術~
首先,您得先到一卡通官方網站中的”加入特約商店“,提供相關資料向一卡通票證公司申請,並向一卡通公司申請測試機器及卡片。
審核通過後,iPASS一卡通公司會提供一台一卡通的測試機器,以及相關的文件及SDK。SDK與之前刷卡系統神似~
主要是輸入長度62的in.txt;輸出的out.txt則為109~928(有無交易記錄)。

在國外行之有年的取餐呼叫器(Pager)最近也在台灣風行起來,看到了二款取餐呼叫器,一個是國產亞克高科(ARCT)由銥特爾科技(02-29974000)代理,一個是韓國(Syscall)製造由鋐鈦科技代理。
二款都可以透過COM PORT設定~~ 以Delphi以及C#針對韓國的做範例。
Delphi
var iPagerno :Integer;
sStr,s :AnsiString;
begin
Try
Pager_COM.StopComm; // 先將Pager Com關閉
Pager_COM.CommName := ComName;
Pager_COM.StartComm;
Sleep(50); //開啟COM需等待
iPagerno := StrToIntDef(PagerNo,1);
sStr := copy(IntToStr(iPagerno),1,4)
s:= Ansichar(#開始指令)+sStr+Ansichar(#結束指令);
Pager_COM.WriteCommData(PAnsiChar(s),Length(s));
Except
End;
C#
public void Pager_Send(String COMName,String PagerNo)
{
public static System.IO.Ports.SerialPort PAGERPORT = new System.IO.Ports.SerialPort();
byte[] PAGERSTART = { 開始指令 };
byte[] PAGEREND = { 結束指令 };
try
{
if (PAGERPORT.IsOpen)
PAGERPORT.Close();
PAGERPORT.PortName = COMName;
PAGERPORT.BaudRate = 9600;
PAGERPORT.Parity = System.IO.Ports.Parity.None;
PAGERPORT.DataBits = 8;
PAGERPORT.StopBits = System.IO.Ports.StopBits.One;
PAGERPORT.Open();
if (!PAGERPORT.IsOpen)
PAGERPORT.Open();
for (int i = 0; i < PAGERSTART.Length; i++)
{
PAGERPORT.Write(PAGERSTART , i, 1);
}
PagerNo = PagerNo.PadLeft(4, '0').ToString();
byte[] PagerNoData= Encoding.Default.GetBytes(PagerNo);
if (!PAGERPORT.IsOpen)
PAGERPORT.Open();
for (int i = 0; i < PagerNoData.Length; i++)
{
PAGERPORT.Write(PagerNoData, i, 1);
}
if (!PAGERPORT.IsOpen)
PAGERPORT.Open();
for (int i = 0; i < PAGEREND .Length; i++)
{
PAGERPORT.Write(PAGEREND , i, 1);
}
}
catch
{
return;
}
}
Delphi或C#與信用卡連接的方式,有直接透過com port通訊或是透過呼叫exe的方式,利用in.txt、out.txt做溝通。然後回傳信用卡卡號/授權碼/刷卡金額等資訊。
示範一下Delphi與C#如何做信用卡線上刷卡。
Delphi
public
{ Public declarations }
ExecInfo : TShellExecuteInfo; // use shellapi
i:integer;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
s:String;
ts:TStringlist;
begin
ZeroMemory(@ExecInfo,SizeOf(ExecInfo));
with ExecInfo do begin
cbSize := SizeOf(ExecInfo);
fMask := SEE_MASK_NOCLOSEPROCESS;
lpVerb := 'open';
lpFile := 'ecr.exe';
Wnd := self.Handle;
nShow := SW_HIDE;
end;
s:='xxxxxxxxxxxxxxxxxxxx'; // 填上信用卡的溝通格式
ts := Tstringlist.Create;
ts.Clear;
ts.Add(s);
ts.SaveToFile('in.dat');
ts.Free;
ShellExecuteEx(@ExecInfo);
deletefile('out.dat');
caption := '刷卡中...';
timer1.Enabled := True;
i:=0;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var ts1:Tstringlist;
sstatus,smoney,scard,sappno:String;
begin
i:=i+1;
if fileexists('out.dat') then begin
Timer1.Enabled := false;
ts1 := Tstringlist.Create;
ts1.LoadFromFile('out.dat');
if ts1.Count >0 then begin
// 讀入檔案,解析格式
end;
ts1.Free;
end;
end;
string dir = System.Windows.Forms.Application.StartupPath;
[DllImport("user32.dll", EntryPoint = "FindWindow", CharSet = CharSet.Auto)]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
private void uForm1_Load(object sender, EventArgs e)
{
try
{
if (File.Exists(dir + "/out.txt")) //刪除out.txt
File.Delete(dir + "/out.txt");
string code = ""; // in.txt格式
using (StreamWriter sw = new StreamWriter(dir + "/in.txt")) //小寫TXT
sw.Write(code);
IntPtr PDC = FindWindow(null, "ecr"); //開啟PosDataCom
if (PDC == (IntPtr)0)
{
try
{
Process p = new Process();
p.StartInfo.FileName = dir + "/ecrnccc.exe";
p.StartInfo.WorkingDirectory = dir;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
p.Start();
}
catch (Exception exp)
{
return;
}
}
this.timer1.Enabled = true;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
private void timer1_Tick(object sender, EventArgs e)
{
if (times == 5)
{
times = 0;
i++;
if (i > 4)
{
i = 0;
try
{
if (File.Exists(dir + "/out.txt"))
{
using (StreamReader sr = new StreamReader(dir + "/out.txt")) //小寫TXT
{
String line;
if ((line = sr.ReadLine()) != null)
{
// 解析
}
else
return false;
return true;
}
}
return false;
}
catch
{
return false;
}
}
}
times++;
}
Swift 2做了些改變,像是 do while變成了 repeat while、for in 加上了where成了 for in where、switch 多了range跟pattern外也多了個 if case、多了個guard(類似if);接下來在exception例外處理有個 do catch…..然後println與print整合了,變成了 print(“”,appendNewline: false)。
學習資源:
美國史丹佛大學著名的ios開發教學線上課程 http://web.stanford.edu/class/cs193p/cgi-bin/drupal/
Apple 官方Swift Bloghttps://developer.apple.com/swift/blog/
Apple Swift 2.1官方文件 https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/
iOS開發者及作家 彼得潘 http://www.slideshare.net/deeplovepan/swift-51667357
大陸 Swift開發課程(中文) http://www.hcxy.me/
因為SQL SERVER EXPRESS精簡版本沒有備份的工具,所以需要自己整理。
建立一個 .BAT批次檔用sqlcmd來執行以下的SQL指令
[SQL]
USE YOURDBNAME — 記得改成你的資料庫名稱
GO
DECLARE @backupTime VARCHAR(20)
DECLARE @sqlCommand NVARCHAR(1000)
SELECT @backupTime=(CONVERT(VARCHAR(8), GETDATE(), 112)
+REPLACE(CONVERT(VARCHAR(5), GETDATE(), 114), ‘:’, ”))
SET @sqlCommand = ‘BACKUP DATABASE YOURDBNAME TO DISK=”D:\DBBACKUP\BACKUP_’ + @backupTime+’.bak”’
EXECUTE sp_executesql @sqlCommand
GO
[/SQL]
參考資料:
WP-T810是目前支援列印QRCode的機型,適合拿來印電子發票。安裝步驟也不困難,先安裝Chip Driver後,就可以把USB模擬成Com Port,重開機後再安裝Windows Driver就可以拿來印電子發票了。
不過要注意一點是,安裝完後,記得在Paper Cut設定End of Each PAGE。
相關連結: Vectronix System Inc微創系統
XAMPP(也有免安裝版本) 是目前Windows上面最熱門的php開發環境套件,唯一美中不足的是無法連結MS SQL。至於有沒有解決方式?當然是有的囉!
一、先看一下目前XAMPP的phpinfo(),看到without-mssql…..一開始有點嚇到!不過別警張
我們的版本是5.6,所以下載SQLSRV32.EXE即可。下載後按右鍵解壓縮。
4.接下來我們確認一下PHP是ThreadSafe或是non-ThreadSafe版本,到XAMPP\php目錄下,找php.dll版本。看到是php5ts.dll(PHP5 ThreadSafe)。
五、確定版本後,回到剛才解開的檔案複製以下的檔案到xampp\php\ext目錄下
六、接著編輯php.ini,尋找extension=區塊,在下面加上二行(注意.dll名稱是你剛才copy過去的版本名稱)
extension=php_pdo_sqlsrv_56_ts.dll
extension=php_sqlsrv_56_ts.dll
七、存檔後重新開啟APACHE
八、回到phpinfo()頁面,如果安裝成功可以搜尋到sqlsrv跟pdo_sqlsrv
九、接著就可以連線到sql資料庫(本文以CodeIgniter為例)

$this->load->database();
$query = $this->db->get(‘cmed’)->result_array();
array_walk_recursive($query, function(&$value, $key) {
if(is_string($value)) {
$value = urlencode($value);
}
});
$json = urldecode(json_encode($query));
echo $json;
備註:
Microsoft® ODBC Driver 11 for SQL Server® – Windows
Microsoft ODBC Driver For SQL Server 提供從 Windows 到 Microsoft SQL Server 的原生連線能力。
2015.8.29 新增免安裝整合包,下載解壓縮後執行xampp-control 即可運作。