2017年6月15日 星期四

給 Windows 10 中文輸入法安裝 “US 鍵盤”

將以下文字存成 .REG 檔案,並匯入登錄即可

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Keyboard Layout]

[HKEY_CURRENT_USER\Keyboard Layout\Preload]
"2"="00000404"
"1"="d0010404"

[HKEY_CURRENT_USER\Keyboard Layout\Substitutes]
"d0010404"="00000409"

[HKEY_CURRENT_USER\Keyboard Layout\Toggle]

解決 Windows 10 發生 Microsoft Compatibility Telemetry 佔用高 CPU 的問題

以系統管理員權限開啟 cmd 命令提示字元,執行以下指令

net stop diagtrack
net stop dmwappushservice
sc config diagtrack start= disabled
sc config dmwappushservice start= disabled

2017年3月10日 星期五

SQL Server 2016 on Linux 使用上的限制

安裝好 SQL Server 2016 on Linux 之後,接下來就是要建立資料庫、建立資料表以及後續的管理工作。不過由於目前在 Linux 上還沒有官方版本的 GUI 管理工具,於是從 Windows 上用 SSMS 連線進去。連線的方法跟連線到 Windows 上的 SQL Server 相同。

經過幾番嘗試,目前發現使用 SSMS 管理 SQL Server 2016 on Linux 上的資料庫時,有以下的限制

  • 不支援用 SSMS 的圖形工具建立、檢視及修改
    1. 資料表結構
    2. 條件約束 (Constraint)
    3. 索引鍵 (Foreign Key)
    4. 資料表圖表

2017-03-10_065244

  • 不支援用圖形工具「編輯前 n 個資料列」,而且會造成 SSMS 閃退

而以下項目是可以使用 SSMS 的圖形工具建立、檢視及修改的

  • 資料庫
  • 索引 (Index)
  • 統計資料 (Statistics)
  • 檢視 (View)
  • 登入
  • 伺服器角色

2017年2月11日 星期六

於 .Net 4.5 使用 Crystal Report 的注意事項

最近接了一個定時抓資料產生報表的案子,想說應該很容易,沒想到卻因為 Crystal Report 的問題卡關了一整天

症狀是這樣的:服務一啟動就發生 1067 錯誤

2017-02-11_164847

看事件檢視器中的錯誤訊息是 System.IO.FileNotFoundException,但是卻不知道是哪個檔案找不到

2017-02-11_165040

卡了好幾個小時之後,轉個方向,改成用 Console 程式來產生報表,結果一跑就看到問題發生的原因了,是找不到這個檔案 "C:\Program Files (x86)\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Common\SAP BusinessObjects Enterprise XI 4.0\win32_x86\dotnet1\crdb_adoplus.dll"

可是根本就沒有這個目錄,怎麼可能找得到檔案呢?

2017-02-11_165541

把這個路徑拿去 google,一搜馬上就有結果了,原來要在 App.config 的 startup 節加上 useLegacyV2RuntimeActivationPolicy="true" 這個屬性。

也就是把
<startup>
改成
<startup useLegacyV2RuntimeActivationPolicy="true">

改好之後,重新建置,執行,果然正常了。
為免遺忘,特記述於此。

2016年9月17日 星期六

Arduino 霹靂燈實驗

  1. 功能簡介
    1. 使用 Arduino 控制 6 個 LED,造成霹靂燈的效果
    2. 使用電位器決定霹靂燈移動的延遲時間
    3. 將電位器輸入與延遲時間顯示在 LCD 顯示器上
  2. 電路連接
    1. LED 接於 Arduino 的 D2 至 D7,每顆 LED 均串接一個 220 歐姆 的限流電阻 
    2. 電位器中間接腳接至Arduino 的 A0 輸入,電位器兩端接腳分別接至 5V 與 GND
    3. LCD1602 透過 LCM1602 接至 Arduino 的 SDA (A4) 與 SCL (A5)

      Pili_Light_bb
  3. 程式
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    
    int ledPin[] = { 2, 3, 4, 5, 6, 7 };
    int delayMs;
    int i = 0, d = 1;
    
    // 設定 LCD 的位址、每行字數、行數
    LiquidCrystal_I2C lcd(0x27, 16, 2); 
    
    void setup()
    {
    // 設定輸出 pin 模式
    for (int i = 0; i < 6; i++)
             pinMode(ledPin[i], OUTPUT);
         // 初始化 LCD 顯示器
         lcd.init();
         lcd.backlight(); } void loop() {

         // 讀取電位器輸入
    delayMs = analogRead(A0);
         lcd.setCursor(0, 0);
         lcd.print("A0 = " + String(delayMs) + "   ");
    // 限制延遲的範圍
         delayMs = map(delayMs, 0, 1023, 5, 500);
         lcd.setCursor(0, 1);
         lcd.print("Delay = " + String(delayMs) + "   ");


         // 點滅控制
    digitalWrite(ledPin[0], 0 == i ? HIGH : LOW);
         digitalWrite(ledPin[1], 1 == i ? HIGH : LOW);
         digitalWrite(ledPin[2], 2 == i ? HIGH : LOW);
         digitalWrite(ledPin[3], 3 == i ? HIGH : LOW);
         digitalWrite(ledPin[4], 4 == i ? HIGH : LOW);
         digitalWrite(ledPin[5], 5 == i ? HIGH : LOW);
         delay(delayMs);
         i += d;
    // 換方向的控制
    if (5 == i)
             d = -1;
         else if (0 == i)
             d = 1; }
  4. 運行影片

2015年12月7日 星期一

Lazarus 系列–4. 連接資料庫

在 Lazarus 的世界裡,沒有 BDE、ADO、dbExpress 等 Delphi 世界裡的資料庫連接方式,內建的是 SQLdb。除了 SQLdb 之外,有一些第三方的資料庫元件廠商也推出了給 Lazarus 使用的連接元件,今天不談第三方元件,專談 SQLdb。

SQLdb 支援的範圍很廣,涵蓋了經常使用的各種資料庫,包括 MSSQL、MySQL、SyBase、PostgreSQL、Oracle、Interbase、SQLite 等,如果超過這些資料庫的範圍,還可以用 ODBC 來連接。而 SQLdb 的底層呼叫的則是各家資料庫提供的原生連接函式庫 (MSSQL 除外,底下會詳細說明)。

底下這張圖是 SQLdb 元件盤上的元件,其實可以完全只用前四個,後面的大多是各家資料庫專屬的連線元件以及管理元件,如果只需要做 CRUD 就可以不用管那些元件,而 CRUD 這四個動作幾乎已經涵蓋資料庫操作的 9 成以上了。

2015-12-06_023943

前四個元件由左而右分別是:

  1. SQLQuery:處理 CRUD 主要的元件
  2. SQLTransaction:處理 transaction 的元件,必要
  3. SQLScript:執行 SQL script 的元件
  4. SQLConnector:連接資料庫的元件,必要

其他的元件說明就請參照官網了。

 

剛才說到,SQLdb 的底層呼叫的是各家資料庫提供的原生連接函式庫,以在 Windows 平台上的 PostgreSQL 為例,呼叫的是 libpq.dll,一個比較方便的方法是下載 [easy_db_plus.zip],這是一個 demo 連結 PostgreSQL 的程式,解開之後,把所有的 dll 檔複製進 Lazarus 的安裝目錄以及你的專案目錄就可以了。

而 MSSQL 的狀況則不同,SQLdb 呼叫的並不是原生的 SQL Server Native Client,而是 dblib.dll,到 [這裡] 下載 dblib_current.zip 並解壓縮之後,將 dblib_XXXX.dll 以及 libiconv2.dll 複製進 Lazarus 的安裝目錄以及你的專案目錄,然後將 dblib_XXXX.dll 改名為 dblib.dll 就可以了。
(看你要連那一個版本的 MSSQL,目前是到 dblib_2008.dll,拿這個連 MSSQL 2012 也可以的)

 

接下來就以 MSSQL 為例子示範如何連接資料庫,並完成一個簡單的 CRUD 應用程式

  1. 放一個 SQLTransaction
  2. 放一個 SQLConnector,設定以下屬性:
    • Transaction 設定為 SQLTransaction1
    • ConnectorType 設定為 MSSQLServer
  3. 放一個 SQLQuery,設定以下屬性:
    • Database 屬性設定為 SQLConnector1,這時你可以觀察到 SQLQuery.Transaction 屬性也自動的被設定為 SQLTransaction1
    • PacketRecords 屬性設定為 -1 (MSSQL必須,其他資料庫可保持為預設值 10)
  4. 放一個 DataSource,設定以下屬性:
    • 設定 DataSet 屬性為 SQLQuery1
  5. 放一個 DbGrid,設定以下屬性:
    • 設定 DataSource 屬性為 DataSource1
  6. 放一個按鈕,撰寫 OnClick 事件如下:

    // 請將黃色字替換成你實際要用的值,可用 :port 來指定 MSSQL 偵聽的 port 號
    SQLConnector1.Close;
    SQLConnector1.HostName := '127.0.0.1';   
    SQLConnector1.DatabaseName := 'DB1';
    SQLConnector1.UserName := 'username';
    SQLConnector1.Password := 'password';
    SQLConnector1.Open;
    SQLQuery1.SQL.Text := 'SELECT * FROM TABLE1';
    SQLQuery1.Open;
  7. 編譯,執行,按下 Button1,若順利的話,可以看到 DbGrid 出現資料。如果出現連接失敗的訊息,請檢查 MSSQL 是否開啟了 TCP/IP 連線,以及 TCP 偵聽的 port 號

剛才完成的只有 CRUD 中的 R,接下來繼續完成 CUD 三部分

  1. 再放一個按鈕,撰寫 OnClick 事件如下:

    try
      SQLQuery1.ApplyUpdates;
      SQLTransaction1.CommitRetaining;
    except
      SQLTransaction1.RollbackRetaining;
      SQLQuery1.CancelUpdates;
    end;
  2. 編譯,執行,按下 Button1,在 DbGrid 上做新增、修改、刪除等動作,然後按 Button2,再去檢查資料,就發現資料已經異動了。
  3. 這種方法必須仰賴 table 本身有 primary key,才能正確的做出異動動作

但是如果 table 沒有 primary key,要如何做呢?SQLQuery 除了 SQL 屬性之外,還有 InsertSQL、UpdateSQL、DeleteSQL 三個屬性,請分別給這三個屬性設定正確的新增、修改、刪除的 SQL 敘述,參數部分用 : 開頭,原值參數用 :OLD_ 開頭 (必須是大寫)

需要更詳細的說明,請參閱 [官網]

這一期就講到這裡,下期再見

2015年11月18日 星期三

Lazarus 系列–3. Canvas 的使用

這一集用一個小程式來示範 Canvas 的使用,這個程式很簡單,就是用來模擬一種玩具「萬花尺

基本上,就是依據不同的參數畫出以下函數的圖形:

x := r1 * cos(θ * t1) + r2 * cos(θ * t2)
y := r1 * sin(θ * t1) + r2 * sin(θ * t2)

r1 = 大圓半徑,r2 = 小圓半徑
t1 = 大圓轉圈的速度,r2 = 小圓轉圈的速度

底下是幾個輸出的範例圖形

001

002

原始程式碼 在這裡下載,請大家自己研究一下囉