2022-06-16

《OpenOffice / LibreOffice Draw》繪製一個像React Logo的圖形

OSS首頁》《文章分類列表》《Base》《Calc》《Draw》《Impress》《Writer

  1.  查看react logo的外觀及顏色。
    1. 開啟網頁 https://zh-hant.reactjs.org/ 
    2. 使用瀏覽器(以chrome為例)的開發人員工具→選取網頁中的元素 (React這個div)


    3. 假設logo的顏色跟React文字的顏色一樣,都是#61DAFB

  2. 整理一下關於react logo圖形的描述。
    1. 由三個橢圓形及一個圓形圖點組成
    2. 各圖形區塊的比例為→橢圓高:橢圓寬:圓高=6:2:1

  3. 開啟Draw,顯示網格(方便對齊),繪製一個寬6cm、寬2cm的橢圓形,先不用考慮精確的尺寸及中心位置,再使用:格式(O)→位置和大小(Z)來調整即可。
    1. 將Position的Base Point 調整至中心點,X: 4cm、Y: 4cm (點選一下 Position 圖示的正中心)
    2. 將Size的的Base Point 調整至中心點。
    3. 確定Size的Width是6cm,Height是2cm。


  4. 調整橢圓的填滿及線條:
    1. 將橢圓形區調整為無填滿:格式(O)→區域(R),選擇:None(無填滿)
    2. 調整線條:格式(O)→線條(I)
    3. 調整橢圓形外框線條的粗細:將線條的寬度設為0.15cm (或輸入4.5pt,會自動轉換為0.15cm)
    4. 調整橢圓形外框線條的顏色:自訂顏色,在Hex#輸入:61DAFB

  5. 複製橢圓形,並調整旋轉的角度:
    1. 選取橢圓,先複製再貼上,這時候兩個橢圓重疊在一起。
    2. 將已選取的橢圓,以中心點 (4cm,4cm),旋轉60度。格式(O)→位置和大小(Z)→旋轉,角度(Angle):60
    3. 再一次複製、貼上,再將選取的橢圓旋轉120度。


  6. 繪製一個直徑1cm,顏色為#61DAFB(邊框及填滿)的園:
    1. 格式(O)→位置和大小(Z):調整確認:中心點 (X, Y) 為 (4cm, 4cm)
    2. 將圓的區調整為填滿#61DAFB:格式(O)→區域(R),色彩Color Hex填入:61DAFB
    3. 外框的顏色,也調整為#61DAFB


  7. 完成了!

2021-12-29

《OpenOffice / LibreOffice Draw》繪製一個太極圖案

OSS首頁》《文章分類列表》《Base》《Calc》《Draw》《Impress》《Writer

  1. 建立一個直徑6cm的大圓


  2. 在大圓內建立兩個直徑3公分的小圓


  3. 選取這三個圓,並將這三個圓「結合」


  4. 將這個結合的圖形「轉換至輪廓線」


  5. 將輪廓線「分開」


  6. 將輪廓線「分裂」


  7. 逐點選取不保留的接點「刪除接點」。
    選取接點後,按Delete鍵刪除。或 選取接點後,按工具鈕「刪除接點」




  8. 逐段「連接」保留下來的線段:按住「Shift鍵」再點選下一線段,完成兩曲線段的選取,再進行「連接」


  9. 全部曲線斷連接後,原區域內的顏色,會自動填滿。
    將完成連接的曲線段,轉換至輪廓線。


  10. 複製這個區域,並貼上。將其中一區域垂直反轉,在水平反轉。調整位置,將兩圖組合成一個圓。


  11. 在兩區域中分別填入黑色、白色。再加入兩個1cm直徑的小圓,一黑一白。


  12. 依照需求,轉換成所需的檔案格式。


  13. 選取圖形,另存圖片。


2021-09-30

《OpenOffice / LibreOffice Calc》除了HLookup, VLookup,有些時候用match, address, indirect來組合運用會更方便

OSS首頁》《文章分類列表》《Base》《Calc》《Draw》《Impress》《Writer

如下附圖,要把A, B, C三欄整理成E1:E25, J1:J25, L1:L25,去除節氣時間、節氣是空白的,通常會想到排序整理一下,但有些時候就是要保留原資料,不能讓原排序亂掉!


在已將所有節氣名稱資料都備妥的情況下,只是要取得節氣對應的日期即發生的時間點,該如何下公式呢?

通常會想到要用VLOOKUP,但是來看一下vlookup的公式參數:

vlookup 公式語法
=VLOOKUP(SearchCriterion; Array; Index; SortOrder)
SearchCriterion: 是指要在參照陣列範圍的第一欄中搜尋的條件值。
Array:是參照範圍,至少包含兩欄,被搜尋條件的範圍,必須放在參照範圍的第一欄。
Index:回傳值再參照範圍所在的欄。第一欄的編號為 1,以此類推。
SortOrder:
 是選用的參數,指出陣列中的第一欄是否向上排序(遞增排序)。
 若第一欄未向上排序(遞增排序),請輸入布林值 FALSE 或0
 搜尋排序過後的欄可更快速,且即使搜尋值未完全符合,只要該值介於排序清單的最低值與最高值之間,函數仍會一律傳回值。
 在未排序的清單中,搜尋值必須完全符合。否則函數會傳回訊息:錯誤:數值不存在(#NA)

這裡搜尋的條件值為「節氣」這個欄位不適合放在第一欄當作被搜尋的參照範圍,所以這裡試著用match, address, indirect來完成預期的效果:

  1. 用match來找到指定節氣名稱在原始資料中的所在位置(第?列) 
    MATCH(SearchCriterion; LookupArray; Type)
    Type:1:遞增, -1:遞減, 0:未排序

    =MATCH(E2;colJQ;0)
    colJQ:原始資料的節氣資料所在範圍名稱,這對應的是C2:C366
    原始資料的節氣資料夾雜空白和中文字,所以是未經排序的資料,Type用0

  2. 用address列出所找到的
    ADDRESS(Row; Column; Abs; A1; "Sheet")
    Row:表示儲存格參照的列號
    Column:表示儲存格參照的欄號 (數字,而非字母)
    Abs 決定參照的類型:
     1: absolute ($A$1)
     2:列絕對;欄相對 (A$1)
     3:列相對;欄絕對 ($A1)
     4:相對 (A1)
    A1 (選擇性) - 若設為 0,則使用 R1C1 表示法。若此參數不存在或設為非 0 值,則使用 A1 表示法。
    Sheet 表示工作表的名稱。必須在前後加上雙引號。

    =ADDRESS(F2+1;1)
  3. 只用所在列數、欄數,結果顯示為:$A$6

  4. 用indirect顯示指定儲存格內容的值
    INDIRECT(Ref; A1)
    Ref 表示將傳回內容的儲存格或區域 (使用文字格式) 之參照。
    A1 (選擇性) - 若設為 0,則使用 R1C1 表示法。若此參數不存在或設為非 0 值,則使用 A1 表示法。

    =INDIRECT(H2)
    顯示指定位址的內容  (指定節氣小寒的對應日期)

  5. 指定節氣小寒的對應時間,就直接將address, indirect合併使用顯示內容
    =INDIRECT(ADDRESS(F2+1;2))

  6. 直接將match, address, indirect合併使用顯示內容
    =INDIRECT(ADDRESS(MATCH(E29;colJQ;0)+1;1))
    =INDIRECT(ADDRESS(MATCH(E29;colJQ;0)+1;2))


2021-01-21

透過SQLite ODBC Driver讓OpenOffice / LibreOffice 存取 SQLite的資料

OSS首頁》《文章分類列表》《Base》《Calc》《Draw》《Impress》《Writer

  • 先確認已經有OpenOffice / LibreOffice 的工作環境
  • 是否已經有管理SQLite資料檔的工具?
  • 下載取得SQLite ODBC Driver
    • http://ch-werner.de/sqliteodbc/ 
    • driver提供的網頁Christian's Homepage這樣說:

      The SQLite Database Engine provides a lightweight C library to access database files using a large subset of SQL92 without the overhead of RDBMS server processes. In order to use that functionality as a desktop database I wrapped the SQLite library into an ODBC driver.

      So far it has been tested with SQLite 2.8.17 and SQLite 3.32.3 on Windows (>= NT/2000) in MS Excel 97 (MSQUERY) with SQLite database files created on Linux. Support for Win64 exists for both SQLite 2.x and SQLite 3.x versions of the driver. It also runs on Linux with unixODBC 2.[0-2].x and with libiodbc 3.[05].x.

      For Win32 operating systems a binary package is available as an NSIS installer in sqliteodbc.exe. It was made with SQLite 2.8.17/3.32.3 and a MinGW cross compiler, and contains the driver DLLs and programs for installation and uninstallation of the ODBC driver.

      For Win64 operating systems a binary package is available as an NSIS installer in sqliteodbc_w64.exe. It was made with SQLite 3.32.3 and a MinGW cross compiler, and contains the driver DLLs and programs for installation and uninstallation of the ODBC driver. Note that this is a 64 bit only driver. If you're using 32 bit software on Win64 you should install the Win32 driver, too. 

  • 取得 sqliteodbc.exe (32位元) /或/ sqliteodbc_w64.exe (64位元),並安裝:
    • OpenOffice / LibreOffice 的安裝程式沒有區分 32/64位元(那就是32位元),如果沒有OpenOffice / LibreOffice 以外的ODBC連接需求,可以只安裝sqliteodbc 32位元版本,如果有32/64位元的需求,就兩個版本都安裝。。

    • sqlodbc.exe / sqliteodbc_w64_dl.exe 的安裝幾乎一樣,以下用64位元版本說明。
      (EXPERIMENTAL: variant which needs System.Data.SQLite.dll or sqlite3.dll in the Windows system folder)




  • 使用Win 10的搜尋功能,搜尋ODBC(或:更精準搜尋ODBC資料來源),準備建立SQLite資料檔的ODBC連線設定,透過DSN(Data Source Name)ODBC連線設定,提供給相關程式存取時使用,如:OpenOffice / LibreOffice ...


    • ODBC資料來源管理員(32位元)
      分頁:使用者資料來源名稱→新增(D)→建立新資料來源→選:SQLite3 ODBC  Driver 

    • 設定DSN:
      假設要連結的SQLite資料庫檔案在桌面的chinook/chinook.db
      Data Source Name : 可依據需求設定,這裡設為chinook
      Database Name : 用Browse選取chinookdb檔案。
    • 完成設定


  • 使用Base,建立資料庫連線
    • 連線到現有資料庫:選取ODBC
    • 設定ODBC連線:選取設定OK的DSN。例:Chinook


    • 設定使用者認證:不需輸入


    • 完成設定:
      註冊資料庫:註冊後,在Calc, Writer, ... 等,也可以使用。







    • 在Calc查看、使用SQLite檔案的資料
      檢視(V)→資料來源(D)   .... (F4)

2019-09-23

SQL : INSERT INTO

SQL : INSERT INTO  將資料插到資料表內

目標:
  1. 使用CREATE TABLE  ... AS SELECT ...,複製資料表MediaType的結構及MediaTypeId=1的這筆資料,到資料表MediaType2。
  2. 使用 INSERT INTO table (field1, field2, ...) VALUES (value1, value2, ...); 插入1筆資料。
  3. 使用 INSERT INTO table VALUES (value1, value2, ...); 插入2筆資料。
  4. 使用 INSERT INTO table (field1, field2, ...)  SELECT fielda, fieldb, ... FROM table_a WHERE ...; 插入1筆資料。
作法:
  1. 測試環境的資料庫,可以參閱以下網址連結來建立:
  2. 選取要作業的資料庫對象(TestWind),開啟(SQL Editor):Tools → Open SQL Editor
  3. 在Query分頁中輸入所要建立測試資料表MediaType2及插入資料的執行指令
    CREATE TABLE MediaType2 AS
        SELECT MediaTypeId, Name 
        FROM MediaType
        WHERE MediaTypeId=1;
    
    INSERT INTO MediaType2 (MediaTypeId,Name) 
        VALUES (2,'Protected AAC audio file');
    
    INSERT INTO MediaType2 
        VALUES (3,'Protected MPEG-4 video file');
    
    INSERT INTO MediaType2 
        SELECT MediaTypeId,Name FROM MediaType 
        WHERE MediaTypeId=4 OR MediaTypeId=5;
    

  4. 執行SQL指令:(F9) Execute SQL (選取要執行的部分SQL指令,按F9,會只執行選取的部分)
    先執行 CREATE TABLE MediaType2,再執行一次INSERT INTO MediaType2 ...
  5. Status : 確認SQL指令 執行無誤


  6. 查看執行結果:

SQL : WITH RECURSIVE ... REPLACE INTO ...

SQL : WITH RECURSIVE ... REPLACE INTO ...
INSERT INTO 不會做資料插入前的檢查,發生錯誤就中斷程式。
在程式開發的過程,時常會遇到一個情境:
如果資料不存在,就插入一筆資料;如果資料已經存在,就更新這一筆資料。
INSERT INTO 衍申的語法:REPLACE INTO 剛好可以滿足這個需求,但資料表必須有主鍵PRIMARY KEY,資料會透過所提供的PRIMARY KEY鍵值,來決定要增加一筆資料?還是更新這筆資料?

目標:
  1. 延續上一篇:SQL : WITH RECURSIVE ... INSERT INTO ... http://blog.bod.idv.tw/2019/09/sql-with-recursive-insert-into.html ,這完成INSERT INTO 相關的資料後,這這裡繼續做REPLACE INTO的動作。
  2. 在 tabWith 已 INSERT INTO : (1,'a'), (2,'aa'), (3,'aaa'), (4,'aaaa'), (5,'aaaaa') 的情況下,要再繼續REPLACE INTO : (4,'b'), (5,'bb'), (6,'bbb'), (7,'bbbb'), (8,'bbbbb')
作法:
  1. 測試環境的資料庫,可以參閱以下網址連結來建立:
  2. 選取要作業的資料庫對象(TestWind),開啟(SQL Editor):Tools → Open SQL Editor
  3. 在Query分頁中輸入SQL的執行指令
    WITH  RECURSIVE cte AS (
        SELECT 4 AS c1, 'b' AS c2
        UNION ALL
        SELECT c1 + 1, c2 || 'b' 
        FROM cte
        WHERE c1 < 8
    ) 
    REPLACE INTO tabWith (score, grade) SELECT c1, c2 FROM cte;
  4. 執行SQL指令:(F9) Execute SQL,Status : 確認SQL指令 WITH RECURSIVE ... REPLACE INTO ... 執行無誤
  5. 查看執行結果
    score=4, (4,'aaaa') 已更新為 (4, 'b')
    score=5, (5,'aaaaa') 已更新為 (5, 'bb')
    已插入 (6,'bbb'), (7,'bbbb'), (8,'bbbbb')