發表文章

目前顯示的是 3月, 2019的文章

190331 Modular Web Design

Visual Studio Code https://code.visualstudio.com/ Feature 1. Emmet 快速輸入法     例如:ul>li*4 2. Intellisense 智能提示 3. Color picker顏色選取器

190330 iDempiere

圖片
1. 換 Logo 以 WEBUI_LOGOURL Lookup 修改 Configured Value,並 Active PS. 圖片外框是切換到 HTML 模式,找到該圖片的 img,將其 border="0" 的 0 改為 1 或您要的厚度。 2. 報表 由於進度跟不上,所以先做筆記 For r IN (     -- drop table t_salesamt     -- create table t_salesamt as     SELECT 0 ad_pinstance_id,                    o.ad_client_id,                    o.ad_org_id,                    o.SalesRep_ID,                    0 m_product_id,                    0 c_bpartner_id,                    SUM( ol.linenetamt )     FROM c_orderline ol     INNER JOIN c_order o ON ol.c_order_id=o.c_order_id     GROUP BY o.ad_client_id, o.ad_org_id, o.SalesRep_ID ) LOOP     v_message := 'LOOP process';     INSERT INTO t_salesamt (ad_pinstance_id, ad_client_id, ad_org_id, salesrep_id, m_product_id, c_bpartner_id, sum)     VALUES (r.ad_pinstance_id, r.ad_client_id, r.ad_org_id, r.salesrep_id, r.m_product_id, r.c_bpartner_id, r.sum) END LOOP;

190328 iOS Swift UITextField 文字編輯偵測

首先,找到的是以下這篇 StackOverflow https://stackoverflow.com/questions/28394933/how-do-i-check-when-a-uitextfield-changes 才發現 Swift 版本不同,用法也不同,怪怪。 目前 Swift 的版本為 4.2,所以就參考 Swift 4 的部份吧。 但剛透過以下連結,查了公司 Mac 中的 Swift 版本,已經到 5.0 了。 https://stackoverflow.com/questions/31247229/which-version-of-swift-compiler-is-the-default-xcode-6-4 xcrun swift --version ————————————————————————————————— 在撰寫 addTarget 時,遇上了以下的問題 Argument of '#selector' refers to instance method 'xxx' that is not exposed to Objective-C Add '@objc' to expose this instance method to Objective-C 網路上查到以下這篇,當中有原文說明。 https://blog.csdn.net/KevinQueen/article/details/78286189 有兩種處理方式,一是在 func 前加上 @objc,另一個是在 class 上方加上 @objcMembers。

190327 iOS Swift 變數的 問號 與 驚嘆號

當變數宣告為 可能空 (這是我稱呼 Optional 的中文)如下 var name: String? 如果要存取 可能空 的變數,可使用驚嘆號(!)來 強制展開 (Forced Unwrapping)其值,如下 print( name! )  但要注意的是,當 強制展開 時,如果該 可能空 的變數真的為空(nil)時,就會出現執行時期錯誤(Runtime Error)。 ————————————————————————————————— 如要安全的讀取 可能空 的值,可使用 可能空綁定 (Optional Binding)如下 if let hasName = name {     print( hasName ) } // end If  用中文說明上面這段程式碼,「如果 name 有值,則指派給 hasName ,並執行大括弧內的程式碼」。 ————————————————————————————————— 另一個能安全存取 可能空 的值或呼叫 可能空 的方法之技術稱為 可能空連鎖 (Optional Chaining)如下。 name?.removeFirst( 1 ) 上面這行程式碼,當 name 為空時,該行程式碼就不會被執行。 ————————————————————————————————— 當變數在宣告時使用了驚嘆號,這樣的方式稱其為 隱性展開可能空 (Implicitly Unwrapped Optional);以這種方式宣告,是可以直接存取該變數的值。但還是可以使用 可能空綁定 與 可能空連鎖 。在 Outlet 的宣告最常使用此種方式。 var name: String! 這種宣告方式還是有其危險性。當存取到空(nil)的 隱性展開可能空 ,執行時期錯誤(Runtime Error)還是會發生。   PS. 最早我把 Optional 稱為 可為空,後來又認為 可能空 這個稱呼更有警告的意味;帶有在使用上要小心處理的意思。

190326 JavaFX build.fxbuild

之前都是用 NetBeans 加上第三方工具來產生 JavaFX 的可執行檔。 現在改用 Eclipse,在建製可執行檔方面並無相關經驗。 於是找到了以下的文章。 JavaFX 教程 (中文) - 第七部分:部署 https://code.makery.ch/zh-cn/library/javafx-tutorial/part7/ 文章中提到,Packaging Format 的下拉式選單,如在 Windows 下,則選擇 exe;但我選 msi,之後看看是否會有問題。 我在點了 Generate ant_build.xml only 後,Eclipse 說只有 JRE 沒有 JDK。後來再怎麼點都沒反應(右下角有進度條在跑,但不會出現任何提示了)。 網路上找了半天,最後解決方式是改專案中的 Build Path,把原本的 jre 改為 jdk。 ———————————————————————————————————— 好不容易解決上述問題(其實還有一些小問題,但都是解決上面問題時所衍生出的)又出現以下問題。 init-fx-tasks:   [taskdef] Could not load definitions from resource com/sun/javafx/tools/ant/antlib.xml. It could not be found. 此問題我是參照以下的 StackOverflow 其中的 Separate JRE。 https://stackoverflow.com/questions/24840414/javafx-build-failed ———————————————————————————————————— 稍早我在 Packaging Format 選項中,選擇了 msi。結果就出現了以下的訊息。就跟 NetBeans 使用的第三方工具是一樣的。 Bundler MSI Installer skipped because of a configuration problem: Can not find WiX tools (light.exe, candle.exe).  Advice to fix:   Download WiX 3.0 or later from h

190322 Apache POI Continued

昨天試了 org.apache.poi.xssf.usermodel.helpers.XSSFColumnShifter https://poi.apache.org/apidocs/dev/org/apache/poi/xssf/usermodel/helpers/XSSFColumnShifter.html 先呼叫 shiftColumns,再呼叫 shiftMergedRegions。 以 Excel 開啟程式改過的 .xlsx 檔,會出現以下訊息。  ——————————————————————————— 已移除的記錄: /xl/worksheets/sheet4.xml 部分的 公式 已移除的記錄: /xl/worksheets/sheet4.xml 部分的 共用公式 已移除的記錄: /xl/calcChain.xml 部分的 公式 (計算內容) ——————————————————————————— 1. 原先多行中有用到公式 SUM,公式都不見了,只有值被留下來。 2. 如果呼叫 shiftMergedRegions 時,我的需求為插入一行,含有 firstShiftColumnIndex 的 Merged Regions會無法成功新增一行。 用 /xl/calcChain.xml 為關鍵字找到以下文章 Excel Error 2010 /xl/calcChain.xml http://sogeeky.blogspot.com/2015/10/excel-error-2010-xlcalcchainxml.html 如依上面的文章,把 /xl/calcChain.xml 刪除,再用 Excel 開啟,就會變成檔案已毁損。 這樣看起來 XSSFColumnShifter 所引起的 Side Effects 比較嚴重。 所以回到最早的方式。 1. 將隱藏行設為顯示;並記錄其行號。 2. 移除 sheet 中所有的合併儲存格;並保留合併儲存格資訊。此處需注意 index 的問題。 3. 插入一行。

190321 Apache POI

因要插入一行,在 shiftColumns 時會影響到 Merged Regions 而 XSSFSheet 針對 Merged Regions 所提供的方法只有 addMergedRegion, getMergedRegion, getMergedRegions, removeMergedRegion, removeMergedRegions 上面除了 addMergedRegion 給的是 CellRangeAddress 外,其餘的方法使用的都是 CellRangeAddress 的索引值。 但吊詭的是,當呼叫 removeMergedRegion 後,某些 CellRangeAddress 在整份 XSSFSheet 裡的索引值就變了。 這可傷腦筯了。 目前想到的方式如下 1. 用 getMergedRegions 取得所有 CellRangeAddress 2. 用 removeMergedRegion 依索引值由大至小移除 CellRangeAddress 3. shiftColumns 4. 修改 1. 中被影響到的 CellRangeAddress 5. addMergedRegion 希望上面的方法可行。 ----------------------------------------------------------------------------------------------- 目前 1., 2. 執行沒有問題 但在 3. shiftColumns 後,在 Excel 中開啟程式處理後的檔案時,會出現修復警告。 修復後,可以發現,插入的那行沒有框線(原檔案有設框線)。 而且,如果有隱藏的行,也會影響到之後的格式。 先來解決隱藏行的問題。 * 從 0 開始到 max last col 如果為隱藏,則改為顯示。 shift 完後,再將原本的 Column 隱藏 (記得原本的 Column Index 要加 Shift 行數後再進行隱藏) 這樣做目前已無大礙。 再來處理 Excel 出現修復的問題。 目前處理方向是在向右 shift 後,進行 column 的 create。

190320 Development Note

剛要加總一個 int array 用了 "java integer array sum" 當關鍵字 找到以下文章 Find Sum and Average in a Java Array https://www.baeldung.com/java-array-sum-average 文中使用的是 Java Stream API,範例程式如下。 Arrays.stream(array).sum(); 以下為 Arrays 的 javadoc。 https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Arrays.html   Arrays.stream( int[] array ) 回傳的是 IntStream,IntStream 是 1.8 才有的類別。難怪我對它不熟。 以下為 IntStream 的 javadoc https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/stream/IntStream.html 在 IntStream 的 sum() 之說明中提到,此 sum() 等同於呼叫以下的方法。 reduce( 0, Integer::sum ); 再看 IntStream 的 reduce​( int identity, IntBinaryOperator op ) 的說明,提到此方法等同以下的程序 -------------------------------------------------------------------------- int result = identity; for (int element : this stream)          result = accumulator.applyAsInt( result, element ) return result; -------------------------------------------------------------------------- 上面提及 accumulator,暫且先擱置。

190318 Development Notes

今天要解決以下的問題。 2019-03-18 11:39:28.640 31659-31659/xxx.javahand.appointing E/AndroidRuntime: FATAL EXCEPTION: main     Process: xxx.javahand.appointing, PID: 31659     java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.         at android.support.v7.app.AppCompatDelegateImpl.createSubDecor(AppCompatDelegateImpl.java:555)         at android.support.v7.app.AppCompatDelegateImpl.ensureSubDecor(AppCompatDelegateImpl.java:518)         at android.support.v7.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:466)         at android.support.v7.app.AppCompatDialog.setContentView(AppCompatDialog.java:94)         at android.support.v7.app.AlertController.installContent(AlertController.java:232)         at android.support.v7.app.AlertDialog.onCreate(AlertDialog.java:279)         at android.app.Dialog.dispatchOnCreate(Dialog.java:389)         at android.app.Dialog.show(Dialog.java:293)         at xxx.javahand.andro

190312 startActivityForResult Intent.FLAG_ACTIVITY_FORWARD_RESULT

我需要的情況 A start B, A finished B start C, C start A, C finished, B needs to be finished also 於是找到以下這篇文章 https://medium.com/@douglas.iacovelli/android-send-result-back-through-multiple-activities-finished-or-not-4c2ba9e95112 A 1. startActivity 2. finish B 1. startActivityForResult 2. onActivityResult C 1. setResult 2. startActivity 3. finish

190312 五臟

【五臟】心、肝、脾、肺、腎 心  英:heart  日:心 しん 越南:trái tim 印尼:jantung / hati 肝  英:liver  日:肝臓  かんぞう 越南:Gan 印尼:hati / liver 脾  英:spleen  日:脾臓 ひぞう 越南:lá lách 印尼:limpa 肺 Note: 日文漢字查詢網站 https://yomikatawa.com/kanji/kanji

190311 JPA Sorting

參考以下網頁 https://www.baeldung.com/jpa-sort String jql ="Select f from Foo as f order by f.id"; 如果 Order By 的欄位屬於 Primary Key(不止一欄位), 就要寫成 String jql ="Select f from Foo as f order by f.[primaryKey].id";

190308 Development Note

胡亂逛,看到以下這個動畫系列分享文章 https://ithelp.ithome.com.tw/articles/10201487 開發不專心,又逛到了非看不可的網頁內容 The Eater Guide to Taipei

190307 Java

Current working directory 目前工作目錄 System.getProperty("user.dir");

190307 JWT Authentication

JWT 的架構如下。 [Header].[Payload].[Signature] Server 端拿到 Token 後,先驗證 Token 的正確性。 [Signature] = Base64Url( encrypt( [Header].[Payload] )) ------------------------------------------------------------------------- 確認 [Signature] 未被更改後,再來就是檢查是否超過規定時間。 在拆解 Token 時,會用到 Regular Expression。 JWT 是由點(.)將 Header, Payload 與 Signature 串接在一塊。 但點(.)在正規表示法中是保留字元。 所以使用 Java 的 String 的 split 拆解 Token 時,必須用反斜線(\)來知會正規表示法的 Parser 將點(.)視為字元而非正規表示法規則的一部份。 但 Back Slash (\) 在 Java 中為跳脫字元。 所以當在 Java 中要使用點(.)做為正規表示法中的字元來拆解字串時,則必須將其表示為下面這樣。 string.split( "\\." ) ; ------------------------------------------------------------------------- Java EE 中要讀取既有的 JSON,可使用 javax.json.Json 類別。 可透過 InputStream 或 Read 來建立 JsonReader 物件。 前面談到的 Token,經由 Base64 URL Decoder 解碼所拿到的 byte array 我們就可直接使用 ByteArrayInputStream 來建立 JsonReader。

190306 Evening Study

圖片
之前開發 JavaFX 時,使用的都是 NetBeans。 這次嘗試使用 Eclipse 來開發 JavaFX。 目前安裝的 Eclipse 版本為 2018-12。 但 Eclipse 並未內建 JavaFX 專案建立的功能。 透過搜尋,找到 e(fx)clipse,但找到的資訊幾乎都是舊版本。 在東看看西瞧瞧下,才在以下連結中,找到安裝用的網址。 https://projects.eclipse.org/projects/technology.efxclipse ------ 190307 ------ 後記:上面連結中提供的 Update  Site 會出現 Conflict,於是又開始在網路上搜尋相關線索。 透過以下網頁,將網頁中的 Install 標示拖曳至 Ecliplse,則會出現下圖中的視窗。 https://marketplace.eclipse.org/content/efxclipse 但以下連結中的網頁又告知,目前 e(fx)clipse 的版本為 3.5.0。 https://projects.eclipse.org/projects/technology.efxclipse 利用 3.4.1 的 URL,將其替換為以下連結;則會出現下圖中的視窗。其中的項目與昨天的兩個連結出現的項目不同。 http://download.eclipse.org/efxclipse/updates-released/3.5.0/site 以上,就是跌跌撞撞,自行摸索後,安裝了 e(fx)clipse 3.5.0。希望之後在開發上不會有問題。

190306 Android

繼續昨天的開發 190305 Android: https://javahand.blogspot.com/2019/03/190305-android.html Android 的連網,我用的是基本內建的 HttpURLConnection。 要使用 HttpURLConnection 要先建立 URL 物件。 透過 URL.openConnection() 可取得 URLConnection。 如果 URL 中使用的是 HTTP 協定,則可進一步將 URLConnection cast 成 HttpURLConnection。 目前連網的基本功,資料傳送使用 HTTP POST,資料格式採用 JSON。             httpurlconnection.setRequestMethod( "POST" );             httpurlconnection.setDoOutput( true );             httpurlconnection.setRequestProperty( "Content-Type", "application/json" ); 另外我用 JWT 進行身份授權驗證。參考以下連結將 JWT 置於 HTTP Header 的 Authorization 屬性。 https://ithelp.ithome.com.tw/articles/10197166              httpurlconnection.setRequestProperty( "Authorization", [JWT] );

190306 JAX-RS + JPA

續 190305 JAX-RS + JPA: https://javahand.blogspot.com/2019/03/190305-jax-rs-jpa.html 如 GlassFish 無法存取 DB Server,JAX-RS 透過 NetBeans 的佈署則會失敗。

190305 JAX-RS + JPA

Server 環境:  Windows Server 2012 R2 x64  Java 8u144  JDBC for MS-SQL 7  GlassFish 5 開發環境:  Windows 10 Pro x64  Java 8u201  NetBeans 8.2 以 @HeaderParam ( " Authorization " ) String sAuthorization 方式來取得 HTTP header 內的參數。參考來源如下連結內容。 https://www.mkyong.com/webservices/jax-rs/get-http-header-in-jax-rs/

190305 Android

圖片
今天進行的是 Android 的開發。 執行 Android Studio 後,出現了更新;如下圖。 只要是 Stable,我都會更新。 更新完 Android Studio 後,出現 Gradle Plugin 的更新,如下圖。 下面連結有 3.3.2 的更新項目。 https://androidstudio.googleblog.com/2019/03/android-studio-332-available.html ------- 下午四點半的分隔線 ------ 剛拉完皮(Layout XML),接下來要進行的是連網的開發。

Apache POI Study

Apache POI Tutorial https://www.tutorialspoint.com/apache_poi/ HSSF: Horrible Spreadsheet Format XSSF: XML Spreadsheet Format ClassPath \Apache_POI\poi-bin-4.0.1-20181203\poi-4.0.1    poi-4.0.1.jar    poi-ooxml-4.0.1.jar    poi-ooxml-schemas-4.0.1.jar \Apache_POI\poi-bin-4.0.1-20181203\poi-4.0.1\ooxml-lib    xmlbeans-3.0.2.jar Tutorial 中的 ClassPath 包含有 Dom4J。但在 4.0.1 已改用 JAXP,所以並未附有 Dom4J 的 jar 檔.。 以下的連結中有相關的說明。 https://poi.apache.org/components/ The OOXML jars used to require DOM4J, but the code has now been changed to use JAXP and no additional dom4j jars are required. Package    org.apache.poi.hssf.usermodel       HSSFWorkbook − 用來讀寫 .xls。MS-Office versions 97–2003. JavaDoc     http://poi.apache.org/apidocs/dev/org/apache/poi/hssf/usermodel/HSSFWorkbook.html Package    org.apache.poi.xssf.usemodel       XSSFWorkbook − 用來讀寫 .xls 或 .xlsx;Microsoft Excel 與 OpenOffice xml 檔案。MS-Office 2007 或之後的版本。 JavaDoc     https://poi.apache.org/api