【Kotlin】SQLite 以 BIG5 排序

參考資料 ----

BIG5 碼線上查詢系統


這是個山不轉路轉的作法 😝


繁體中文習慣以 BIG5 排序,但 SQLiteORDER BY 是依 UTF8 排序,既然如此,那我們就轉個彎,在資料表內新增一個欄位,存放 BIG5 內碼,當需要排序時,就 ORDER BY 這個 BIG5 內碼欄位。

 

例如:

我們有個資料表,存放考試科目,則建立 2 個欄位 exname(考試科目名稱)、exbig5,當新增一筆記錄時,就查出 exname 的中文 BIG5 內碼 並存入 exbig5;當需要排序時,就 ORDER BY exbig5


先產生中文字的 BIG5 內碼表(參考底下的相關筆記)


將內碼表置於 /專案目錄/asset/


MAP 讀入內碼表(這屬於耗時的工作,應交由 Thread、AsyncTask 或 Coroutine 執行)


新增儲存記錄時,查詢 exname 內(逐字)的 BIG5 內碼,所得到的字串存入 exbig5


之後的查詢,若需要排序 exname 時,就改排序 exbig5



相關筆記 ----

【C#】以程式列出 中文字 與 BIG5 內碼 的對應表



【MySQL】簡體中文的 編碼與排序關係

參考資料 ----

MySQL Chinese, Japanese, and Korean Character Sets

一图弄懂ASCII、GB2312、GBK、GB18030编码

 

探索了正體中文的排序,好奇...那簡體中文呢?

 

MySQL 對簡體中文在 UTF8 時的排序似乎看不出規律性

一层楼, 一枕奇, 七侠五义, 万花楼, 三侠五义, 三国志, 三国演义, 三字经, 世说新语, 东周列国志, 九章算术, 乾隆下江南, 二刻拍案惊奇...

中間突然冒出了筆劃很多的 "乾隆下江南"


因為大陸是漢語拼音,所以若以 gb18030 編碼排序,看似是以拼音字母順序排列

-- 按漢語拼音排序
SELECT * FROM 資料表 ORDER BY CONVERT(欄位名 USING gb18030) 

結果如下:

八段锦, 八美图, 白圭志, 白虎通, 百家姓, 北里志, 北梦琐言, ...

"" 開頭的書名被排到後面去了!整個排序跟上面完全不同!


如果仿照正體中文的排序法呢?

SELECT * FROM 資料表 ORDER BY CONVERT(SUBSTR(欄位名,1,1) USING gb18030), BINARY 欄位名

結果如下:

八段锦, 八美图, 白圭志, 白虎通, 百家姓, 北梦琐言, 北里志, ...

沒有很大差異,僅 北梦琐言, 北里志 前後對調

 

相關筆記 ----

【MySQL】查詢結果按正體中文排序



【CentOS7】 以 smbclient 指令連線 Windows 共享主機

參考資料 ----

SAMBA smbclient



Linux 系統的電腦要連線 Windows server 主機,必須要安裝 SAMBA 套件,然後就可以在圖形操作界面環境連線 Windows 主機,進行檔案相關操作。

 

如果要以指令方式,則是 smbclient


瀏覽

[user]$ smb  -L //IP/目錄名  -U 使用者帳號

要注意:通常網管不會直接開放 Windows 的根目錄出來共享,所以 Windows 主機的 IP 後應該會接目錄名稱。

接著會出現要您輸入密碼,若輸錯密碼,就會回到

[user]$ 

重新下 smbclient 指令

當密碼正確,就會列出 Windows 主機有開放共享的目錄及檔案



登入操作

[user]$ smb  //IP -U 使用者帳號

登入成功後,會看見提示字元

smb:\>

接下來的操作,類似 FTP 的指令模式,不過指令較陽春,例如:

 

 

列出目前 Windows 目錄下的檔案及子目錄

dirls



切換目錄

cd 切換目錄,還可以輸入中文

smb:\>cd 目錄名



下載檔案

get 完整檔案名稱(含副檔名)

會下載到您 Linux 當時所在的目錄,例如:

在您輸入 smbclient 要連線 Windows 主機時,所在的 Linux 目錄為 /tmp ,則 get 下來的檔案就會存放在 /tmp

get 完整檔案名稱(含副檔名)  /指定目錄/另存檔名

當要下載到指定目錄時,就必須輸入檔名,也就是說下面的指令是行不通

get 完整檔案名稱(含副檔名)  /指定目錄/



上傳檔案

put 本地檔案名

沒有來源目錄,就是目前的 Linux 本機目錄

沒有指定目的地目錄,就是上傳到目前的 Windows 目錄


離開

exit



【CentOS7】Visual Studio Code 無法啟動

老人家安裝在 CentOS 7Visual Studio Code 已經有一陣子無法運作了 -- 只要一啟動 vscode,就僵在啟動畫面,目前的版本為 1.57.0

 

暫時先下載安裝 Sublime 頂著用。

 

可是...我還是想用 vscode 啊...


爬文後,參考網友的做法,先到 Microsoft YUM repos 找到舊的 1.52.1 版,手動下載安裝,並停用自動更新。

 
* 移除目前的 vscode 1.57.0 版
[root]# yum remove code

* 切換到下載下來的 1.52.1 的目錄(我是下載到 /tmp)
[root]# yum install code-1.52.1-1608137084.el7.x86_64.rpm

* 停止 vscode 自動更新
[root]# vi /etc/yum.repos.d/vscode.repo
* 啟動了 vi, 按 i 進入編輯模式
* 將 enabled=1  改為 enabled=0
* 按 :x 存檔離開
 

重開機,就可以使用 vscode

 

如果重開機後,Gnome 的圖形界面功能表--"軟體開發" 內仍沒有 vscode 的圖示,則可以

開啟終端機視窗,輸入

/usr/share/code/code

手動啟動 vscode


【PHP】以個體導向(物件導向) 方式進行日期的運算

 

 
// 設定時區
date_default_timezone_set('Asia/Taipei');


// 建立 日期時間個體(物件)
$date = new DateTime();    // 未帶參數時, 就是現在

$date = new DateTime('2000-01-01');    // 帶參數, 就是指定日期
                                       // 沒有時間參數, 就是 00:00:00
                                       // 以下同此例
                                       // 老人家較關心日期,所以就不管時間了!   XD

// 日期往後(日期時間的加法)
echo '方法一:加 10 月';
$date->add(new DateInterval('P10M'));	// P 表 period, M 表 "月"
echo $date->format('Y-m-d') . "\n";	// 格式化顯示 西元 年-月-日, 相當於 date() 函式


echo '方法二:加 2 天';
$date->modify('+2 day');
echo $date->format('Y-m-d') . "\n";


// 日期往前(日期時間的減法)
echo '方法一:減 8 月 10 天';
$date->sub(new DateInterval('P8M10D'));
echo $date->format('Y-m-d') . "\n";

echo '方法二:減 2 天';
$date->modify('-2 day');
echo $date->format('Y-m-d') . "\n";


echo '當月 1 日';
$date->modify('first day of');
echo $date->format('Y-m-d') . "\n";


echo '當月月底';
$date->modify('last day of');
echo $date->format('Y-m-d') . "\n";


echo '前一天';
$date->modify('yesterday');
echo $date->format('Y-m-d') . "\n";


echo '後一天';
$date->modify('tomorrow');
echo $date->format('Y-m-d') . "\n";


echo '當月第一個週一';
$date->modify('first mon of');    // 大小寫無差, 完整寫法 monday 也行
echo $date->format('Y-m-d') . "\n";


echo '當月最後一個週六';
$date->modify('last sat of');
echo $date->format('Y-m-d') . "\n";


echo '移至離當日最近的下個週四';
$date->modify('thursday');
echo $date->format('Y-m-d') . "\n";


echo '移至下個週五';
$date->modify('fri');  // 因為隔天就是週五, 所以只移了 1 天
echo $date->format('Y-m-d') . "\n";


echo '移至下個週三';
$date->modify('wed');
echo $date->format('Y-m-d') . "\n";


echo '移至下個月';
$date->modify('next month');    // 似乎無法搭配 day, ex: next day
                                // 也不能搭數字, ex: next 2 month
echo $date->format('Y-m-d') . "\n";

// 前一年的年初(第一天)
$date->modify('first day of january last year');

// 前一年的年底(最後一天)
$date->modify('last day of december last year');


// 日期的複製
// 不能直接宣告一個新的變數, 這樣有點類似 "指標"
$date2 = $date    // 這樣其實是將 $date2 指向 $date
                  // 要將 $date2 看做是 $date 的別名
// 當變更了 $date2 的值, 其實是變更 $date

// 應該要
$date2 = new DateTime($date->format('Y-m-d')); 
 

 

 

關於上述例子中,簡單英文日期時間的參數格式,可以參考 Relative Formats

 

【Delphi】MySQL 3.51 ODBC connection string


 
Driver={MySQL ODBC 3.51 Driver};Server=主機IP;Database=資料庫名稱;User=連線帳號;Password=密碼;Option=3;

// 如果不是走預設的 3306 port, 而是用自定的連線埠
Driver={MySQL ODBC 3.51 Driver};Server=主機IP;Database=資料庫名稱;Port=自定的連線埠;User=連線帳號;Password=密碼;Option=3;

// 自定資料庫使用的字元集
Driver={MySQL ODBC 3.51 Driver};Server=主機IP;charset=UTF8;Database=資料庫名稱;Port=自定的連線埠;User=連線帳號;Password=密碼;Option=3;
 


【Delphi】在 ProgressBar 內顯示進度文字

Form 上放一個 ProgressBar(name=progressBar)Label(name=lblProgress)


 
lblProgress.Parent := progressBar;
lblProgress.AutoSize := False;
lblProgress.Transparent := True;
lblProgress.Top :=  0;
lblProgress.Left :=  0;
lblProgress.Width := progressBar.ClientWidth;
lblProgress.Height := progressBar.ClientHeight;
lblProgress.Alignment := taLeftJustify;
lblProgress.Layout := tlCenter;
 


【WEB程式】以 Apache ECharts 繪製圖表

參考資料 ----

Apache ECharts 教程

 

 

Apache Echarts 原本由百度開發並開放源碼,之後成為 Apache 的專案項目之一,所以有詳盡豐富的中文參考文檔(雖然是簡體中文)。

 

要使用 ECharts 有多種方法,老人家選擇 "通过 jsDelivr 等 CDN 引入 的方式",除了 jsDelivr 外,還有 Staticfile;直接由 CDN 引入好像成了目前的趨勢,ZingChart 現在也採用這種方式。


最簡單的範例

 
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>ECharts</title>
    <!-- 引入 echarts.js -->
    <script src="https://cdn.jsdelivr.net/npm/echarts@5.0.2/dist/echarts.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/echarts@5.0.2/theme/vintage.js"></script>	<!-- 樣式 js -->
</head>
<body>
    <!-- 為 ECharts 準備一個具備大小(寬高)的 DOM -->
    <div id="main" style="width: 600px;height:400px;"></div>
    <script type="text/javascript">
        // 基於準備好的 DOM,初始化 echarts 實體
        var myChart = echarts.init(document.getElementById('main'), 'vintage');    // 第 2 個參數 是 樣式 選項: 預設, light(內建), dark(內建), vintage, macarons, infographic, shine, roma
                                                                                   // 如果沒有 "樣式" 參數,就是預設樣式
                                                                                   // light樣式 與 預設樣式 的差異在 light 的顏色比預設更淡
                                                                                   // 若要採用不同樣式, 除了內建的 light/dark,其他樣式則上面也要引入相應的 js

        // 指定圖表的配置項和數據
        var option = {
            title: {
                text: 'ECharts 入門範例'
            },
            tooltip: {},
            legend: {
                data:['銷量']
            },
            xAxis: {
                data: ["襯衫","羊毛衫","雪紡衫","褲子","高跟鞋","襪子"]
            },
            yAxis: {},
            series: [{
                name: '銷量',
                type: 'bar',
                data: [5, 20, 36, 10, 10, 20]
            }]
        };

        // 使用剛才指定的配置項和數據顯示圖表。
        myChart.setOption(option);
    </script>
</body>
</html>

 


 

相關筆記 ----

【WEB程式】以 Chartjs 繪製圖表 



【Delphi7】儲存寫入 UTF-8 文字檔

參考資料 ----

BOM

 

 

本篇筆記的做法所儲存的文字檔,預設不含 BOM,若要為含 BOM 的文字檔,則需在一開始要寫入文字檔時,加入 BOM 記號。

 

 

 
const
    sFilename = 'd:\要存放文字檔的目錄\uf8write.txt';
var
    myfile: TextFile;
    ss: string;
    xx: integer;
begin
    Screen.Cursor := crHourGlass;

    // 若文字檔不存在, 則新建文字檔
    if not FileExists(sFilename) then
    begin
        AssignFile(myfile, sFilename);
        ReWrite(myfile);
        CloseFile(myfile);
    end;

    AssignFile(myfile, sFilename);
    ReWrite(myfile);

    xx := 0;
    // 將 memo1 的內容逐列寫入文字檔
    while (xx<memo1.Lines.Count) do
    begin
        // 檔首寫 BOM
        if (xx=0) then
            begin
                ss := #$EF#$BB#$BF + AnsiToUTF8(memo1.Lines[xx]);
            end
        else
            begin
                ss := AnsiToUTF8(memo1.Lines[xx]);
            end;
        WriteLn(myfile, ss);
        xx := xx + 1;
    end;

    Flush(myfile);
    CloseFile(myfile);
    Screen.Cursor := crDefault;
    Showmessage('ok');
end;
 



相關筆記 ----

【Delphi7】讀取 UTF-8 文字檔



【Javascipt】偵測使用者上網瀏覽的裝置

老人家想做個網站,只供 手機/平板 瀏覽,所以要判斷辨認使用者的裝置

 

 
<body>
<script language="javascript">
if( /Android|webOS|iPhone|iPad|Mac|Macintosh|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) 
    {
        alert('mobile');
    }
else
    {
        alert("PC");
    }
</script>

...
...

</body>