2017年11月7日 星期二

Use IntelliJ IDEA to build a web application with Java Servlet + Tomcat

最近自己在學習建立後端的Server所以順便記錄一下當作筆記,使用的工具為IntelliJ IDEA 2016.2.4,這邊先從建立一個Java Web Application + Tomcat開始,然後再慢慢增加內容


一. Create New Project
選擇Java Enterprise裡的Web Application然後按下Next,如下圖,然後專案名稱與存放的地方就根據自己的需求設定



二. 建立Servlet程式
在專案左邊的src資料夾按下滑鼠右鍵然後選New然後選Servlet,如下圖,然後自己定義Servlet的名字,至於有一個設定Create Java EE 6 annotated class預設是勾選,可自己決定要不要加入,我這邊是沒有使用


三. 編輯web.xml檔
在專案資料夾有一個WEB-INF,開啟裡面的web.xml編輯

這邊主要是加入以下程式碼,上面的servlet是設定你要跑的程式的名字(名字可以改變,不一定要等於程式的檔名)以及他路徑(com.HAS.HelloChunhuaServlet),而下面的servlet-mapping中的servlet-name要跟上面對應,最後的url-pattern就是這支程式的呼叫URL路徑(ex: localhost:8080/HelloChunhua)
<servlet>
    <servlet-name>HelloChunhuaServlet</servlet-name>
    <servlet-class>com.HAS.HelloChunhuaServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>HelloChunhuaServlet</servlet-name>
    <url-pattern>/HelloChunhua</url-pattern>
</servlet-mapping>


四. 編輯Java檔
去src裡面打開你剛剛建立的servlet java程式,然後鍵入如圖中的程式,其中doPost不寫也可以,如有特殊需求再加入

五. 執行
都撰寫好以後就可以測試執行,順利的話就可以看到如下畫面囉

六. 其他注意事項
1. 如果你的系統本身有安裝Tomcat的話記得先關閉,因為IntelliJ IDEA有本身的Tomcat,如果沒有關閉系統的Tomcat的話兩者會有衝突

2. 專案不用放在Library/Tomcat/webapps,這是系統的Tomcat

3. 如果上述步驟無法順利執行的話去File裡面的Project Structure確認每一個資訊都是正確的










2017年10月23日 星期一

Swift動畫 -- 矩形按鈕變成圓形按鈕

今天分享如何將矩形的按鈕動畫變成圓形的按鈕,先看原來的畫面,如圖所示按鈕原本是長方形




而我們最後的目標就是將它們變成圓形的按鈕,如下圖所示:




範例中我們用一個Timer來使按鈕3秒過後可以變成圓形的

Timer語法
NSTimer.scheduledTimerWithTimeInterval(3, target: self, selector: #selector(ViewController.changeButton), userInfo: nil, repeats: false);

其中的changeButton就是我們要改變Button狀態的方法

程式碼如下
func changeButton(){

        // 設定loginByFB的圖
        var fbButtonImage: UIImage!
        
        fbButtonImage = UIImage(named: "ic__FB_1.png")
        
        self.loginByFB.setImage(fbButtonImage, forState: .Normal)
        
        // 設定loginByGooglePlus的圖
        var googleButtonImage: UIImage!
        
        googleButtonImage = UIImage(named: "ic__G+_1.png")
        
        self.loginByGooglePlus.setImage(googleButtonImage, forState: .Normal)

        // 縮小按鈕的動畫 3.0 = 執行速度 數字越大跑得越慢 ; 這邊是展示縮小放大的動畫
//                UIView.animateWithDuration(3.0 ,
//                                           animations:
//                    {
//                                            // 縮放尺寸
//                                            self.loginByFB.transform = CGAffineTransformMakeScale(0.6, 0.6)
//                                            self.loginByGooglePlus.transform = CGAffineTransformMakeScale(0.6, 0.6)
//                    },
//                                           completion: { finish in
//                                            UIView.animateWithDuration(0.6){
//                                                self.loginByFB.transform = CGAffineTransformIdentity
//                                                self.loginByGooglePlus.transform = CGAffineTransformIdentity
//                                            }
//                })
        

        // 讓按鈕從長方形變成圓形的動畫 -- 用來將FBGoogle+按鈕變成圓形的
        UIView.animateWithDuration(3.0 ,
                                   animations:
            {
             
                // 下面程式如果註解掉的話會直接執行completion的地方
                
                // 重新定義 loginByFB 的位置與frame
//                self.loginByFB.frame = CGRectMake(self.loginByFB.frame.origin.x - 60, self.loginByFB.frame.origin.y - 160, self.loginByFB.frame.size.width, self.loginByFB.frame.size.height)
//                
//                self.loginByFB.layer.cornerRadius = 0.5 * self.loginByFB.bounds.size.width
//                
//                
//                self.loginByFB.layer.borderWidth = 1.0
//                self.loginByFB.clipsToBounds = true
//                
//                
//                // 重新定義 loginByGooglePlus 的位置與frame
//                self.loginByGooglePlus.frame = CGRectMake(self.loginByFB.frame.origin.x - 60, self.loginByGooglePlus.frame.origin.y - 160, self.loginByGooglePlus.frame.size.width, self.loginByFB.frame.size.height)
//                
//                self.loginByGooglePlus.layer.cornerRadius = 0.5 * self.loginByFB.bounds.size.width
//                
//                
//                self.loginByGooglePlus.layer.borderWidth = 1.0
//                self.loginByGooglePlus.clipsToBounds = true
                

            },
                                   completion: { finish in
                                    UIView.animateWithDuration(3.0){
                                        
                                        // 重新定義 loginByFB 的位置與frame
                                        self.loginByFB.imageView?.image = fbButtonImage
                                        
                                        self.loginByFB.bounds.size.width = 60
                                        self.loginByFB.bounds.size.height = 60
                                        
                                        self.loginByFB.frame = CGRectMake(self.loginByFB.frame.origin.x - 70, self.loginByFB.frame.origin.y - 145, self.loginByFB.frame.size.width, self.loginByFB.frame.size.height)
                                        
                                        self.loginByFB.layer.cornerRadius = 0.5 * self.loginByFB.bounds.size.width
                                        
                                        self.loginByFB.layer.borderWidth = 1.0
                                        self.loginByFB.clipsToBounds = true
                                        
                                        // 重新定義 loginByGooglePlus 的位置與frame
                                        self.loginByGooglePlus.imageView?.image = fbButtonImage
                                        
                                        self.loginByGooglePlus.bounds.size.width = 60
                                        self.loginByGooglePlus.bounds.size.height = 60
                                        
                                        self.loginByGooglePlus.frame = CGRectMake(self.loginByGooglePlus.frame.origin.x + 60, self.loginByGooglePlus.frame.origin.y - 200, self.loginByGooglePlus.frame.size.width, self.loginByGooglePlus.frame.size.height)
                                        
                                        self.loginByGooglePlus.layer.cornerRadius = 0.5 * self.loginByGooglePlus.bounds.size.width
                                        
                                        self.loginByGooglePlus.layer.borderWidth = 1.0
                                        self.loginByGooglePlus.clipsToBounds = true
                                    }
        })
        
    }


上面程式碼幾乎都有註解,所以就不在這一一說明,只截取動畫有關的程式碼,片段如下

UIView.animateWithDuration(3.0 ,animations:{},completion: { finish in
                                    UIView.animateWithDuration(3.0){}})


其中數字3.0就是動畫執行的速度,數值越大動畫就跑得越慢,而animations:{}的部份表示動畫開始的地方,這個地方可以空白不寫,沒寫的話則動畫會直接跑finish的部分,同樣的finish的地方也可以空白不寫那就只會跑開使的部分



詳細範例可以從以下網址下載
GitHub分享網址: https://github.com/jenemebo/SquareButtonToCircleButton

2017年10月21日 星期六

Xcode測試的Simulator模擬器鍵盤不見了?

各位如果使用新的Xcode 9.0版測試時應該會發現模擬器的鍵盤不見了,如下圖所示:



而要讓鍵盤出現的方式很簡單,只需要在上方的Simulator工具列選Hardware裡面的Keyboard,然後再選Toggle Software Keyboard就可以了如下圖所示:




現在,我們的鍵盤出現啦~ 



2017年10月19日 星期四

如何解決發布錯誤 ERROR ITMS-90167: "No .app bundles found in the package"

今天分享一下如何解決在發布的時候遇到ERROR ITMS-90167: "No .app bundles found in the package" 的問題,在搜尋網路的解決方法時發現網路上是說這是因為當你用比較舊版的Xcode開發工具時(如7.3.1)在新的Mac OS (Mac OS Sierra 10.12)是無法正常發布的,需用較新的application loader 3.6(含)以上發布才可以,然後就教你去哪裡下載

可是,經我自己測試以後發現不用這麼麻煩,其實用Xcode 7.3.1本身就可以解決這個問題了,方法就是在Run旁邊選擇裝置的地方選擇Build Only Device就可以了~ 如下圖所示:




上述方法就可以解決ERROR ITMS-90167: "No .app bundles found in the package" 的問題,不過..是說現在還會有人跟我一樣在用Xcode 7.3.1嗎?  XDD





參考網址: 

2017年10月17日 星期二

如何解決Xcode indexing paused的問題

今天分享如何解決Xcode在執行測試時遇到的indexing paused的問題,遇到這個問題時會導致Xcode無法順利的執行測試,例如無法順利地利用模擬器或真機做測試而一直卡在那裡,如下畫面:



而在網路上找到的解決方法有: (以下舉例我找到的答案)
  1. Open your Project Folder.
  2. Find ProjectName.xcodeproj file.
  3. Right-Click Copy and Paste to Safe Place.
  4. Right-Click Show Package Contents.
  5. Find project.xcworkspace file and delete that file.
  6. Reopen Your Project and clean and Rebuild.
或是
  1. Deleting "Derived Data" in the Organizer, and re-open and workspace. (fail to fix)
  2. "Show Package Contents" on the .xcodeproj file and deleting .xcworkspace
甚至有附上語法
rm -frd ~/Library/Developer/Xcode/DerivedData/*

rm -frd ~/Library/Caches/com.apple.dt.Xcode/*

不幸的是,上述的方法在我自己嘗試以後都無法解決!

在我折騰一番之後我發現另一個解法,首先去工具列的Product --> Scheme --> Edit Scheme...,如下圖




按下去之後會看到如下畫面




點擊左側的Run,然後在右邊的畫面中找到Launch的地方,這邊預設會是Wait for executable to be launched,將它改成Automatically然後按下Close並且執行,理論上這時候就可以解決indexing paused卡住的問題了





參考網址:
1. https://stackoverflow.com/questions/13831559/xcode-stuck-on-indexing

2. https://stackoverflow.com/questions/26494082/swift-xcode-index-freezing-or-slow

2017年10月15日 星期日

如何邁向iOS APP工程師 & Swift分享 (二)

今天的分享主要是Swift 3的基本宣告與一些基本概念,而這些分享都是以之前完全對iOS與Swift沒有任何概念的基礎之下,所以會從非常基本的層面開始分享~ 讀者可依據自己的需求跳過已知的部分

以下便是這次分享的內容主題
1. 學習Swift 3前的前置作業 (Mac原生環境為例)
2. 如何建立一個Swift專案或是Playground (Playground介紹)
3. 專案結構基本介紹 (vs Objective C)
4. Swift程式風格


一. 學習Swift 3前的前置作業 (Mac原生環境為例)
1. 一台Mac電腦 (Mac Book Pro / Mac Book Air/ Mac Mini..etc)
雖然網路上有提供在非Mac電腦上撰寫Swift的方法,但是這邊是以Mac原生環境為例,所以要
先準備好一台Mac電腦
2. 安裝Xcode
有了電腦以後就是安裝Xcode開發工具,Xcode可以在Apple官方網站下載,網址: https://developer.apple.com/download/ (需有Apple ID)

二. 如何建立一個Swift專案或是Playground
 承上步驟安裝好Xcode以後就是建立一個Swift專案,到應用程式啟動Xcode,然後點選File --> New --> Project,如下圖


然後選左邊的iOS --> Application --> Single View Application --> Next,如下圖


然後在Language的地方下拉選單就可以看到Objective-C / Swift的選項,如下圖


再按下Next以後一個Swift的專案就建好了~ 而要建立Playground則是點選File --> New --> Playground --> Single ViewPlayground最大的特色就是可以即時看到執行的結果


三. Swift的一些程式風格介紹

Swift基本上是一個很自由的程式,例如if敘述句可以不用加(),當然你要加的話也可以,但是它依然有一些限制的風格,例如Var testInt = testInt2 (空格)+1 與  Var testInt = testInt2+1是不一樣的,因為Swift規定你要不是前後都要有空格,不然就是前後都沒有空格不然便會出錯

以上就大概稍微介紹如何建立一個Swift專案以及淺談Swift的一些撰寫風格,下次的分享終將會正式進入Swift的程式語言裡


解決iOS 14上如果更換預設瀏覽器(例如從Safari換成Chrome)時, 用Scheme架構會無法回到上一頁的問題

 如果遇到以下問題時 須在Info裡的LSApplicationQueriesSchemes裡設定多增加https, 如下圖: