dotnet core 3.0 + Entity Framework Tip – 如何印出底層自動產生的SQL

在寫 dotnet core / .net MVC 的專案時,通常都會搭配 Entity Framework (簡稱EF)來存取資料庫,如 MS SQL、MySQL 等等。

以我們這次的案子來說,會了讓同仁能更了解 EF的底層機制,所以想說在 dotnet core 3.0 的程式裏,加上設定,方便觀察各個指令會對應到的SQL Script.

以 dotnet core 3.0來說,我們要做的設定動作有
一、產生對應 LoggerFactory (*比如說 : 是要寫到Console、或是 Event 、DB 等其它目的地)
二、在程式連結資料庫(DBContext)的時候,把上面產生的 Logger也一併綁定,方便系統輸出。

如果是用 dotnet Core 2.x的話,
DBContext 裏的設定如下


參考資料 : https://stackoverflow.com/questions/53690820/how-to-create-a-loggerfactory-with-a-consoleloggerprovider

dotnet core 3.0 DateTime in JSON

最近手邊有個小案子,需要從前端傳遞日期到後端 ~
如果是用預設的 .net core 功能來接受 json的日期資料的話 ,可能會遇到問題

比如說,後端收到的是 這種格式2012-04-23T18:25:43.511Z ~
而不是我們一般常使用的格式,如 2019-12-02 13:22:59
做了一下功能,看來是預設的套件沒有支援,所以如果真的傳這種資料的話 ~
C#這邊會需要做點加工 …

以下,是我們的解法 供大家參考 ~
一、安裝 NewtonsoftJson的套件
二、修改設定檔 Startup.cs 來

第一步,安裝 NuGet 的套件

第二步,修改 Startup.cs 以加入 NewtonsoftJson

voilà ~ 一切就ok囉 ~~~
後面我們再一一分享,這次小專案裏我們還遇到哪些小事件~ (*如 Entity Framework 產生 SQL 該如何取得/列印在 Console)

dotnet core 3 安裝過程 (Error 500.30 ANCM In-Process Start Failure)

最近因為專案需要,所以開始導入 dotnet core ,以目前的時間 2019-12-2,最新的版本為 .NET Core 3.0

官方連結 在這 https://dotnet.microsoft.com/download/dotnet-core/3.0
手邊的測試環境為 Win Server 2012 + IIS 8 (*上面已有裝 dotnet core v2.2)
不過在手邊使用的開發工具為 Visual Studio for Mac, v8.3.6 + .NET Core 3.0 ~

所以在將程式從本機發佈的資料夾放至主機時

會出現 HTTP Error 500.30 – ANCM In-Process Start Failure 的錯誤訊息

當然發生的原因可能有很多,不過思考一下 v2.2 如果主機上已經成功的運作 ~
其實應該很有可能是執行環境的問題 ~
後來到官網看了一下,很有可能是沒有裝最新的3.0 runtime ~

最後依官網的建議,裝上 Hosting Bundle (依它的指示 下一步下一步 安裝即可)

安裝完成後,再將 IIS 重啟後,即可正常執行 ~

.NET Core 版本清單的資訊,如下 ~ 各位如有需要可自行選擇。
https://dotnet.microsoft.com/download/dotnet-core

Java Path Setup / Java 路徑設定

For Mac OSX 10.5 or later

In Mac OSX 10.5 or later, Apple recommends to set the $JAVA_HOME variable to /usr/libexec/java_home,
just export $JAVA_HOME in file ~/. bash_profile or ~/.profile.

 

For Linux

For each user,  user can add the java path in  ~/. bash_profile or ~/.profile.
For all users,  system admin can add the java path in /etc/profile

To find java path location, try one of followings

  • update-java-alternatives -l
  • cd /
    find . -name ‘javac’                //might need root privilege
  • alternatives –display java
  • sudo update-alternatives –config java
  • Or take look at the following

     –  /usr/local/java/jdk[version]
    –  /usr/lib/jvm/java-1.11.0-openjdk-amd64
    –  /usr/lib/jvm/java-1.8.0-openjdk


    Once the JDK path is found,  we can add into ~/.bash_profile or  ~/.profile as following,

export JAVA_HOME=”path that you found”

export PATH=$JAVA_HOME/bin:$PATH

For Windows   (*Reference : mkyong blog

Find  System Properties (*My Computer > Right Click > Properties)

Add JAVA_HOME

 

ADD JAVA Bin PATH     //Window 7

 

ADD JAVA Bin PATH     //Window 10

 

Last Step,  Let’s run some test

 

以上為安裝JDK 軟體後 ,需做的基本路徑設定。
也希望對各位初學者或是想找路徑的朋友   有些幫助 ~

以上

時賦科技  FRank

軟體開發 之持續整合 Continuous Integration 簡介篇

– 前言

相信在目前的軟體工作環境裏,每一位開發人員都會用到一些版本管理工具,如 Git/SVN/VCS 等。(*當然,偶爾還是會看到傳說中的「資料夾管理法」 ~~~ XD

時賦科技 - 資料夾版本控制法
資料夾版本控制法

– 主旨

有了版本控制軟體之後,基本上我們就能共用同一份程式碼,並且從Log能知道是誰,在何時改的程式碼(*人是誰殺的) ~

時賦科技 - git log

不過… 我們透過版本管理軟體 取得最新的程式碼時,我們並無法確定 程式是否可以正常編譯?!
導至有時一早進辦公室就會遇到 編譯問題/Compiler Error ~ (*曾有朋友反應,因此他都很晚進公司~ XDD)

有沒有一種方式,可以程式工程師能安心(也專心地)開發程式 。
就算程式裏的語法上有錯誤 ~ 也可以在寫入(版本控制)時 能立即通知。(如下)

時賦科技 - Auto Build Email 通知

 

在這種時候,我們就需要一些輔助工具可以達到這種功能,所謂的 Continued Integration (我們這邊稱它 持續整合工具)

如圖,
CI Tools by APPX

目前我們常聽到的工具 大概就都在圖上,主要像 Jenkins, TeamCity, Travis CI, Bamboo 等。 對CI 界,排名前八大有興趣的可以看這裏

– 專案實作考量

這次,我們考量的點 有以下幾項
一、新建立的 Build Server 能連接到 Bitbucket Git Server (幾乎每家都可以~)
二、能夠支援 .net 以及 Java 程式碼 (*因為我們的案子主要以這兩種語言為主)
三、最少能週期性的Pulling 檢查 是否有最新的更新(code commit) ;
最好的情境 應該不要一直問Git,而是當Bitbucket有更新時 主動通知 Build Server,再進行編譯動作。

四、能夠將編譯的結果 盡快通知給團隊人員或是負責人,如 email。(*最好還可以看到程式的diff 差異)

五、費用考量 ~ (*free 當然很好,不過如果需要一些費用而提供多一點的功能 也是可以接受的~ 畢竟,就像投資一樣,投的好,相對的回收一定會更好的 ~)

六、(*非必要性) 支援  SSO/LDAP 整合

在看了以上的工具 及加入所有考量的情境之後,我們決定先採用 JetBrain 的 TeamCity 試試看 ~
最起碼看了官網上的介紹(*連結) 最起碼前面一到五項,相信是沒問題的 ~
(*google的 Android Studio 好歹也是從這家公司的IDEA J 衍生出來的,相信不會差到哪裏去)

甚至在2017年中間推出的版本裏,它還支援 docker, .net CLI, Kotlin DSL project 等 ~
相信對一般的開發團隊應該很足夠,再者  去年還放寬了免費版的限制
(從 20 build config -> 100 build config)
這家軟體商真的是佛心來著 !!!

詳細的功能介紹 請見官網說明(*網址: https://www.jetbrains.com/teamcity/features/

接下來的幾週,就讓我們以實際使用的過程 來分享給各位 ~
預計會有
一、TeamCity 安裝篇 (*已完成)
二、TeamCity 設定篇
三、TeamCity 進階設定篇

希望大家在軟體開發的生活裏能夠更輕鬆,將時間用在更珍貴的地方 (如喝咖啡,逛fb  等美好的事物上~ XD)

時賦科技 - 美好的事物
比如像這樣 ~

Cheers ~

[Java 101 基礎篇] Java程式出錯的九種最佳處理方式 ! ( 前篇 )

前言:  通常我們程式執行正常的時候,一切都很美好。但是月有陰晴圓缺,往往都會有意外發生。這篇就是來分享一下遇到意外時,該如何處理 ~

像是下面這張圖,相信大家很常見到 ~ 就是一個常見的情境 ~

在開始進入正題(Exception Handling)之前 ,先說明一下 Java 跟 Exception 關係 ~


(* Exception 跟 Error 以及 RuntimeException的繼承關係圖)
https://docs.oracle.com/javase/tutorial/figures/essential/exceptions-throwable.gif

程式裏面,如果是遇到  Error/RuntimeException ,這一類的類別被Java歸類成 UnChecked Exception,代表  程式人員 不用特別寫程式進行處理。(*因為這一類的情形,如果真有發生,我們也來不及救了…  。如果JVM 出現OutMemoryError,我們也只能舉雙手投降了)。

至於像其它常見的,像 IOException,FileNotFoundException 等,
都分類為 Checked Exception,這些都是代表程式出錯時,JVM 會把 出錯的資訊 包裝成特定型態的物件,方便程式人員可以用程式來挽救出錯的情形,但不致於讓程式整個直接結束( Game Over)。

Java對所謂的 Checked Exception,在語法上有提供了幾個相關的關鍵字,
如 try / catch 以及 throws。接下來,我們先來看 用 try / catch的用法 ~

Round 1 :  通常程式需要 I/O,  connect Network, 或 Database 時,我們都會加上 try/catch
如下

上面的寫法,相信很容易在各種案子或各個地方看到~
基本上是ok的…javac 編譯也會過…我們稱 「有借有還」
就像 有 open動作,就該會有 close的動作。

不過,重點 不只要寫 close,還要在對的地方寫 ,寫錯地方 就等同於沒寫。
在上面第五行的地方,使用了 new  FileInputStream(file) ;
也許各位會想,就是 new FileInputStream的物件,為何會出錯呢 ?!
原因可能會有很多,舉簡單二、三個原因 來看,

  1. 檔案已經存在。代表無法再產生一個 FileInputStream來存取同一份檔案資源
  2. 寫入權限不足,比如說 一般user無法寫入系統的資料夾
  3. 硬碟空間已滿,這理由也很有可能會發生的喔 ~~~

那出錯之後呢 ?!  程式沒出錯的話,會一路從上往下執行,然後略過 catch。
但是如果一出錯,則程式流程會立即跳出 try { } 的區塊,然後進入 catch 的部份。
以上面來說的話,就是第五行出錯,會直接跳到第七行的 catch ,
而忽略最重要的第六行 close() .  (*進而可能會導致記憶體一直浪費,而沒有被回收,也就是所謂的 Memory Leak)

所以,該怎麼做比較對呢 ?!
Round 2 : 加上 finally  ,如下面的第九行

但是別忘了,即使在第九行之後,如果有呼叫 close() 時,也還是要再加一個 try/catch 才能真正的讓編譯器通過。 (*不然就是考慮 throws 用法 ,我們稱之謂 「轉身逃避」)

但…又有人會說,為何已經用 try / catch 了,而裏面還要再包一層呢 ~~
是不是 感覺有點多餘呢 ~?!

沒錯,就是有點多餘… 所以在 JDK 7 出來後,Oracle 原廠有加入個簡化的語法,
稱之為  try-with-resource,
語法:
try (  欲使用後關閉的物件  )  {
//  正常地 使用物件
}  catch (相對應的例外) {
// 例外發生時的處理,如 log, rollback 或 send email 等
}

範例如下 :

不知各位有沒有注意到,

  1. 沒有 close()
  2. 更沒有巢狀的 try / catch

try-with-resource的語法就是要讓開發人員更簡便的開發程式,
這麼好用的語法有沒有限制呢 ?!      答案是 有 !!!!

限制就是  欲使用後關閉的物件 必需直接或間接地  實作 AutoCloseable ,至於有哪些類別已經實作,請參考下圖

如果 使用的物件不符合期待(也就是直接/間接地 實作 AutoCloseable) ,
編譯器會”好心的提醒”開發人員…

是不是真的很實用呢 ?!


也許會想問說,如果是用 JDK6 甚至是 JDK5 的話呢 ?! 嗯~~ 沒問題的,就像下面這張~


(* 就別做夢了,趕快昇級 JDK 版本囉 ~  XD

後半部,我們會再接著介紹程式出錯之後, Exception 的建議處理方式 ~

參考資料(Reference)  :
https://dzone.com/articles/9-best-practices-to-handle-exceptions-in-java

[Java101 基礎篇] 三張圖 搞懂 Shallow Copy 以及 Deep Copy

前言
有些時候,我們會需要將資料(物件) 覆製一份,
方便獨立操作 ~ 卻發現結果跟想像的不一樣。

 

讓我們從程式碼來做個說明~

Sample Code

一個正常的物件  Person p = new Person();

Object Structure
單一物件的結構

 

Shadow Copy

java101_referenceCopy
有二個參考點(References)指到同一份資料

Deep Copy

Deep Copy Result
二個完全獨立的物件

對了~

對參考點的概念(Reference) 還不是很清楚?!
對建構子的運用 還想更進一步嗎?!           可以參考我們提供的教育訓練

 

參考資料:
https://dzone.com/articles/java-copy-shallow-vs-deep-in-which-you-will-swim

 

[Java101 基礎篇] – Java 8 Lambda 的崛起

雖然Java 8 已經出來好一陣子了~  (記得是 2014的三月)
但還是有不少人會詢問什麼是 Lambda,什麼是 匿名類別 Anonymous class
藉著最近專案的機會,分享一下我們對 Lambda的了解,希望能有所幫助。

預計這一系列的文章,會有

  • Java 8 Lambda 的崛起
  • Java 8 Lambda 的語法
  • Java 8 Lambda 跟集合物件的應用
  • Java 8 Lambda 跟File I/O的應用

 

今天就先針對 Java 8 Lambda 的出現,先做個應用的說明 ~

讓我們從一個很常用的例子開始~  「使用者在畫面上按下按鈕,然後秀出 HelloWorld」
(*這部份機制,可應用在 Java Swing/FX  以及 Android )

 

以Java Swing 視窗程式為例,在 Lambda出現之前,我們可能的做法有下列幾項 ~

  1. 寫一個完全獨立的新類別  來實作 ActionListener,然後在JButton呼叫addActionListener時,當成參數傳入。

     
  2. 寫一個在main主程式 類別的內部類別(Inner class),然後在也是一樣,在JButton呼叫addActionListener時,當成參數傳入。

     
  3. 使用匿名類別(Anonymous Inner class),在JButton物件呼叫addActionListener 時,當成參數傳入

 

 

在Java 8 Lambda 出現後,我們可以用下列的寫法

jb.addActionListener( (a)-> System.out.println(“Hello”));
沒錯,就只要寫 一行,就可以有同樣的效果~~~

剩下的,就讓Java 8 Compiler 將程式碼 編譯成跟之前 actionListener 一樣的class code !!!

是不是很方便~~~ 趕快試試看囉~~

 

對了~

匿名類別 (Anonymous class)還不是很清楚?! 可以參考我們提供的教育訓練

 

 

參考資料:
https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

http://www.coreservlets.com/java-8-tutorial/#setup

從基本Java課程,到Git版本管理 完全免費的線上課程都在這~~

整理一下,最近看到的免費線上資源 方便大家參考~~

(*主要都是針對初學者,來介紹基本概念/操作的介紹。)

==============================================

 

基本的Java 程式語法介紹 (免費)

https://www.udemy.com/learn-java-programming/

 

善用 Eclipse 開發環境來加速 Java 開發 (免費)

https://www.udemy.com/luv2code-eclipse-ide-for-beginners/

 

Github 版本管理 初體驗 (免費)

https://www.udemy.com/git-started-with-github/

Android Programming Introduction  新手入門介紹  –  17 小時 !!! (免費 Free)

https://click.linksynergy.com/fs-bin/click?id=BoHFIyu6APU&subid=&offerid=323058.1&type=10&tmpid=14537&RD_PARM1=https%3A%2F%2Fwww.udemy.com%2Fandroid-tutorial-for-beginners%2F%3FcouponCode%3D743754385

 別忘了,還可以配合字幕進修英文 —  聽力跟字彙哦!!!

 

[職場觀察101]程式設計師 履歷該如何寫?

最近公司因為案件需求,所以開始尋找合適的人才。
在看了許多求職者的履歷後,不禁對目前一般人對履歷的寫法感到很大的問號~

原因不外如下,

一、履歷 看不出重點,沒有特別說明工作內容

履歷最主要的是希望讓面試官(公司)能夠很快地對求職者有一個概念,
所以放上工作的經歷是最基本的。甚至依年限排列(從最近一個 列至第一個工作)
所謂放上經歷,不只有列出前公司名稱及工作職位,如 OOO 公司 – XXX職位。
更重要的要寫上在這個職位工作的內容,
比如說 工程師,可以這樣寫
參與 YYY專案,負責專案裏的後端程式,利用 AAA技術透過BBB框架來達到CCC的功能。

而技術支援/測試人員可以這樣寫
參與 YYY專案,負責專案裏的測試,包含前端UI功能以及流程確認,並包含後端的資料驗證。

這樣子,才會讓面試官對求職者有多一點的了解,以及印象; 來增加面試的機會。

二、內容充滿錯字

這部份,就看的出來求職者用不用心,有沒有仔細準備。
在履歷寫錯字,如同一開始就像告訴人家,我不是小心的人,很容易出錯。
如果各位看官你是面試官,你希望找到一個不細心的人嗎?!
或是 希望找到一個很容易出狀況給你收拾的員工嗎?!

三、在人力資源網站 持續公開履歷

這部份,很多人可能以為沒有關係,
事實上 如果沒有要找工作,建議就關閉,不用讓各家公司一直收到你的履歷。
因為這就像跟大家說 我一直在找工作,有需要可以找我。
某個角度來說,會讓面試官(公司)覺得這個人可能有什麼狀況,一直都在找工作。
至於怎樣能增加面試的機會,列出幾點參考

  1. 明確的列出自己工作經驗/內容,讓對方可能盡可能了解自己的背景、能力,以及期待。
  2. 仔細地閱讀自己的履歷內容,避免有錯字或是文句不順的地方。
  3. 可以低調的在104尋找更好的機會,若有合適的工作機會,再寄給對方。

希望以上的幾點心得,能夠幫助到有需要的人 ~

當然,我們目前也正在尋找合適的人才,如果有興趣的人 也歡迎跟我們連絡 ~~

請將資料寄至 admin at appx.com.tw