能取代parse服務的台灣MBaas平台-Lightspeed

Facebook收購國外著名的MBaaS(行動雲端平台)服務 Parse後,前幾天無預警的宣布一年後將關閉服務。也讓大家開始尋找新的MBaaS(行動雲端平台)服務,希望能為企業App加入推播、即時通訊、社交功能,來加速開發流程。
尋找解決方案中,看到台灣在2014年就有赫迅這家公司,提供了Lightspeed這個服務。包辦複雜的後端架構,而且提供推播、即時通訊以及社群互動功能加入app。
lightspeed01
目前該服務已經服務的客戶有許多知名的公司及媒體如Sony、遠傳電信、蘋果日報、蘋果動新聞、壹週刊網、窮游、海底撈火鍋、ump聯動優勢、csdn、中國銀聯。
lightspeed02
目前的申請方式需先至服務的申請頁面,然後填寫表單後核准。
lightspeed03
核准後會收到一封裡面有beta code的邀請函,然後註冊後就可以試用。
lightspeed04

lightspeed05

lightspeed06

相關聯結:
Lightspeed官方網站
sdk說明文件
試用申請
Lightspeed Admin Console
主控台

Delphi讀取utf8格式ini及取得動態內容

使用Delphi讀取utf8格式時需使用Tmeminifile,另外動態取得的範例。

VAR SYSINI: TMemIniFile; // 讀取utf8格式的ini需使用TMemIniFile
ts:tstringlist;
i:integer;
ApplicationPath:string;
begin
// 先取得目前執行路徑
ApplicationPath := ExtractFilePath(Application.exename);
if ApplicationPath[length(ApplicationPath)] = ‘\’ then
begin
ApplicationPath := copy(ApplicationPath, 1, length(ApplicationPath) – 1);
end;
// 讀取sys.ini裡的memberid區塊並顯示值
MEMO1.Lines.Clear;
ts:=tstringlist.Create;
SYSini := TMemIniFile.Create(ApplicationPath+’\sys.ini’,TEncoding.UTF8);
if NOT (SYSini = nil) then begin
sysini.ReadSection(‘memberid’,ts);
for I:=0 TO TS.Count-1 DO BEGIN
MEMO1.Lines.Add(TS[I]);
MEMO1.LINES.Add(sysini.ReadString(‘MEMBERID’,TS[I],”));
END;
end;
ts.Free;
end;

RAD Studio 10 Seattle 行動開發成功案例分享研討會

由捷康科技所辦的RAD Studio 10 Seattle 行動開發成功案例分享研討會

RAD Studio 10 Seattle 行動開發成功案例分享研討會 (一) 張子仁先生

[研討會影片]

[研討會簡報]

 

RAD Studio 10 Seattle 行動開發成功案例分享研討會 (二) 廖啟甫先生

[研討會影片]

[研討會簡報]

[即時路況Apk]

[尋找加油站Apk]

 

RAD Studio 10 Seattle 行動開發成功案例分享研討會 (三) 文中資訊阮翔先生

[研討會影片]

[研討會簡報]

 

Delphi XE10裡面的setup_paserver作用

Delphi 的PAServer(Platform Assistant Server)是一個可跨平台的程式。一般安裝的是mac上面的pkg版本,但是有網友在問setup_paserver_upd1.exe 的版本作用是什麼?

這個版本是提供在32位元開發的朋友,如果要編譯成64位元版本時,可以在64位元的電腦上安裝paserver。接著透過連線的方式,將程式碼complier到64位元的windows環境。

POS系統結合iPASS一卡通範例

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

餐飲POS新利器-取餐呼叫器與程式連線結合範例

_sE_4843323437

11221600_10153061581601541_7866645605585747097_n

12191428_10153061581676541_4081491775779063707_n

11200883_395736973959542_2078442132751771489_n

在國外行之有年的取餐呼叫器(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;
            }
        }

POS系統介接與信用卡機連線的作法

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++;
        }

Delphi 10 Seattle隆重登場

很久沒更新近況了!最近Embarcadero出了Delphi 10 Seattle,主要是針對行動裝置/PC以及IOT物聯網。

到時候再來分享一下

1442335478407

另一件事在設計電子發票,當然圖片中少了CODE39的條碼啦XDD

11205488_10152975552941541_8585917734032493888_n

使用SQLite Expert將access資料匯入SQLite

因為要撰寫PC轉到手機的程式,所以需要將手上的ACCESS轉到SQLite上。可以使用SQLite Expert這個工具來轉資料,不過需要付費的Professional才有。
sqliteaccess001
點選 Fiel -> New Database
sqliteaccess002
輸入要新建db的路徑,程式會根據database name建立對應的alias
sqliteaccess003

 

建立完成後就看到有新的Database

sqliteaccess004

 

接下來點選上面的 Import/Export->Data Transfer Wizard,會有對話框問你要Export匯出或Import匯入。然後下面是匯入的方式是使用SQL或是ADO data source

sqliteaccess006

接著會問你用什麼方式連線,可以 Use Connection String按Build

sqliteaccess007

 

點選Microsoft Jet 4.0 OLE DB Provider連結access

sqliteaccess008

選取我們要連的db

sqliteaccess009

接著開始匯入

sqliteaccess010

中間會出現login畫面直接按ok

sqliteaccess011

接著會問你要匯入那個table

sqliteaccess012

完成後系統使最後確認

sqliteaccess013

開始匯入資料

sqliteaccess014

匯入完畢後就可以看到塞進去的table跟資料了sqliteaccess015

 

 

Delphi透過odbc連結SQLite

Delphi5~7連接SQLite可以透過上述網站的SQLite ODBC Driver,透過ADO元件連結資料庫。

這樣一來,在開發行動裝置時。透過SQLite Expert建置完資料庫後,利用Delphi做資料整理~
再將資料放在Android 的asseets 或是iOS放在app document,core data初始化時再copy過去。

P.S Delphi 連線字串
DRIVER=SQLite3 ODBC Driver;Database=c:\test\test.db;LongNames=0;Timeout=1000;NoTXN=0;SyncPragma=NORMAL;StepAPI=0;

 

http://www.sqliteexpert.com/

http://www.ch-werner.de/sqliteodbc/