2019年2月17日 星期日

Using firebase google email login for Android

首先,你創好一個專案,在Menu選擇Tools-> firebase -> 跟著tutorial 步驟,就能順利完成以下動作

=>簡單Sign up, Sign in 程式碼
=>Import 一些external libs
=>在Firebase 開了一個專案,名稱是你的專案名稱


------------------------------------------------------------------------------------------------------------------------

再來需要在Firebase上做一些更改

=>Google email 開啟

通常這時候,應該是 可以正常登入的,但!! 如果你修改了package name,你就會大亂 登入不進去了,接下來會一步一步的更改內容
------------------------------------------------------------------------------------------------------------------------


1.得到SHA-1

利用這網址的步驟,可以得到這台電腦的SHA-1
https://stackoverflow.com/questions/27609442/how-to-get-the-sha-1-fingerprint-certificate-in-android-studio-for-debug-mode

2.更改Firebase auth的登入權限,和替換google-service.json
點選->project->Authenticaiton->Sign-in methed->google,會得到下面視窗,然後點選Project Settings,會開啟一個新的視窗


下面有一個Your apps,請點選Add app (如果是之前舊的APP 就直接刪掉,然後新增)

下面有四個步驟

1. Fill in info
Package name => 你專案新的 package name
App nickname =>我隨便打
Debug signing certificate SHA-1=>把剛剛拿到SHA-1貼上去
 Register app

2.Download config file
替換你專案的google-services => 在project -> app 資料夾

3. Add firebase SDK
如果是新的專案,就需要新增,只是換package name 原本你就做完了
4. Run
確認是否正常運作,他會告訴你成不成功


Reference:

https://dotblogs.com.tw/starhao/2016/11/12/160526  =>有些是舊的,已經用不到
https://console.cloud.google.com/apis => Firebase 會自動幫你新增到Credentials 通常用不到
https://blog.yorkxin.org/2013/09/30/oauth2-1-introduction.html => 介紹為什麼要用到Oauth2

2018年11月1日 星期四

添加adb功能 on mac


如果沒有.bash_profile

則 touch .bash_profile

之後


vim .bash_profile

新增


#Android adb

export PATH=${PATH}:~/Library/Android/sdk/platform-tools

重啟command line

備註:當Android studio update後,發生問題

1.刪除Android studio全部資料
rm -Rf /Applications/Android\ Studio.app
rm -Rf ~/Library/Preferences/AndroidStudio*
rm ~/Library/Preferences/com.google.android.studio.plist
rm -Rf ~/Library/Application\ Support/AndroidStudio*
rm -Rf ~/Library/Logs/AndroidStudio*
rm -Rf ~/Library/Caches/AndroidStudio*



2.配置



















3.preferences設定

Font=> size 18,Line spacing 1.2
Editor -> General -> Auto Import -> add unambiguous imports on the fly
Editor -> General -> Auto Import -> optimize imports on the fly

2018年10月31日 星期三

Android Callback、Handler 差別


Callback

因為Android 常使用other thread做資料處理的動作(background deal,not UI thread),所以當訊息處理完,時常需要回覆給UI thread處理完畢(但這時候回覆訊息到UI thread的部分,還是other thread負責,所以不能直接更新UI),所以這時候就有callback機制。

專案簡單說明:

1.MainActivity new 一個DownLoadService 準備要下載東西,但我需要一個回應說DownLoadService下載好了。

2.使用interface 做出一個OnDownLoadListener,給MainActivity實作出來方法。

3.MainActivity使用setOnDownLoadListener,將MainActivity實作出來的OnDownLoadListener,給downLoadService。


4.這時候downLoadService可以下載東西,下載完之後使用onDownLoadListener.onComplete("String")回應給mainActivity實作的方法,就可以達到不同trhead但可以異步訊息傳送。

注:加上Looper.prepare() and Looper.loop()

是因為toast.show要有一個Looper把taost(本身用到UI thread)傳遞給message queue,讓handler抓message(toast)出來處理。
而一個new thread沒有Looper,所以要Looper.prepare(),給他一個new looper,之後讓他loop.loop給他插入toast進入 message queue。

github:https://github.com/TakmingMark/PracticeCallback


Handler

主要是當處理完畢的資料,需要和UI講,講完之後就可以更新資料(Handler處理是在UI同一線程,所以可以更新UI)

github:https://github.com/TakmingMark/PracticeHandler

合起來使用的話,來講一下使用情況。

callback就像一個員工A,他要一直處理照片傳輸的問題。

handler就像一個員工B,他要監控員工A,當員工A把照片傳輸做完時,回傳一個訊息給員工B,然後員工B告訴老闆(UI update)說照片傳輸完畢

github:https://github.com/TakmingMark/CallbackAndHandler


參考文章:
https://blog.csdn.net/ErLiangCode/article/details/52117831
http://andy02172001.blogspot.com/2017/10/androidinterfacecall-back.html
https://blog.csdn.net/ErLiangCode/article/details/52117831

2018年10月8日 星期一

對於git一些常用指令紀錄



git reset —mixed 默認值,回歸某標籤,標籤以後檔案依舊會留存在Working directory,但更改內容不在staged Area裡面,要從新add and commit。

git reset —hard  回歸某標籤,標籤以後檔案不會留存在Working directory,直接拋棄某標籤以後的修改。

git reset —soft 回歸某標籤,介於mixed和hard間操作,標籤以後檔案依舊會留存在Working directory,更改內容也在staged Area裡面,不用從新add,但要commit。


git reset [ae3034d] 指定標籤回歸,檔案依舊會留存在Working directory,但不在staged Area裡面,要從新add and commit

git reset [current~2] 當前往前數兩個回歸,檔案依舊會留存在Working directory,但不在staged Area裡面,要從新add and commit


git commit —amend  不會產生新的commit,會依照之前的commit來添加檔案內容,和可修改commit message內容
more fileName 得知檔案內容

git log —oneline 打印 history of commit ,並一個commit 印出一行資訊

git checkout -b [branchName] 創建一個分支,並轉換過去

git branch [branchName] 創建一個分支,不會轉換過去

git branch -a 看全部的分支

git checkout [branchName] 轉換分支

git branch 得知此分支名稱

git branch -D [branchName]刪除某分支

more [fileName] 印出檔案內容

more .git/config 觀看此專案的資訊

git remote -v 顯示遠端服務器的名稱

git diff [branchName] 用此分支和其他分支比較檔案差別。

git merge [branchName] 結合某分支

git fetch [origin] [branchName]獲取遠端服務器某分支的版本 

git merge FETCH_HEAD 本地使用fetch之後,用這個指令才能同步

git pull  直接一次性解決fetch and merge的問題,但通常不推薦,通常一步一步來,先fetch然後diff來了解是否merge

origin 代表服務器的名稱

git [instruction] -h 查看某指令使用方法

git push origin —delete [branchName]刪除遠端的分支

git branch -m [branchName] 更改分支名稱

git tag -l 目前標籤名稱列

git fetch -t 抓取遠端的標籤

git push —tag 本地標籤傳入遠端

git tag -d [tagName] 刪除某本地標籤

git push origin :refs/tags/[tagName] 刪除遠端標籤

git remote add [remoteName] [remoteLink] 增加一個遠端

產生push遠端不需要一直輸入帳號密碼

step1:ssh-keygen 生成public and private key in /root/.ssh/

step2:GitHub->settings->SSH and GPG keys 把本地電腦id_rsa_pub複製貼過去

step3:vim .git/config 如果使用後還是需要帳號密碼,代表我們走的是https,要更改成ssh(從github上複製過來)

額外補充:ssh-copy-id -i /root/.ssh/id_rsa.pub [account]@[IP] 如果對方是linux電腦,可以使用此方法傳遞public key


平行別人專案步驟

step1:git remote add upstream GitHub@IP

step2:git fetch upstream

step3:git merge upstream/master

step4:git push origin master


2018年9月25日 星期二

change terminal color for mac的方法


依照這個網址來做
https://medium.freecodecamp.org/jazz-up-your-bash-terminal-a-step-by-step-guide-with-pictures-80267554cb22


中間會遇到python utf-8的問題
修改:https://coderwall.com/p/-k_93g/mac-os-x-valueerror-unknown-locale-utf-8-in-python

找尋特定檔案位置
https://www.macx.cn/thread-2080254-1-1.html

python路徑
https://blog.csdn.net/a542551042/article/details/47149959

editor on mac
http://www.sublimetext.com/

2018年4月9日 星期一

Re:还在用JSON? Google Protocol Buffers 更快更小 (原理篇)

看了這篇
https://mp.weixin.qq.com/s?__biz=MzUyNzMwMTAwNw==&mid=2247483736&idx=1&sn=247c204880bde06eda8b77fd14e4d93a&chksm=fa00e1b8cd7768aee094020746eda244b26f2bb78332e8c68257f80d7966ed1ba82ed23dfe23&scene=21#wechat_redirect

順便學習了一些程式編碼問題與複習(雖然這篇後段完全看不懂...)

首先先看這篇,先了解原碼、反碼、補碼
http://www.cnblogs.com/en-heng/p/5570609.html

然後 裡面有計算ZigZag

根據int 編碼h(n) = (n << 1) ^ (n >> 31)

依照範例 數值 1,-1來練習

if n=1;

original code=0,0000000000,0000000000,0000000000,1

n<<1= 0,0000000000,0000000000,0000000001,0
n>>31= 0,0000000000,0000000000,0000000000,0

(n << 1) ^ (n >> 31)
^ => 0,0=0 1,0=1 0,1=1 1,1=0

so =  0,0000000000,0000000000,0000000001,0

Decimal=2
---------------------------------------------------------------  
if n=-1;

original code=1,0000000000,0000000000,0000000000,1
反碼=1,1111111111,1111111111,1111111111,0
補碼=1,1111111111,1111111111,1111111111,1
 
n<<1= 1,1111111111,1111111111,1111111111,0
n>>31= 1,1111111111,1111111111,1111111111,1

(n << 1) ^ (n >> 31)
^ => 0,0=0 1,0=1 0,1=1 1,1=0

so =  0,0000000000,0000000000,0000000000,1

Decimal=1

2018年3月8日 星期四

轉傳:用 ConstraintLayout 解決鍵盤擋住輸入框及按鈕

https://medium.com/joe-tsai/%E7%94%A8-constraintlayout-%E8%A7%A3%E6%B1%BA%E9%8D%B5%E7%9B%A4%E6%93%8B%E4%BD%8F%E8%BC%B8%E5%85%A5%E6%A1%86%E5%8F%8A%E6%8C%89%E9%88%95-642fe2a9b855

這個方法太棒了,想在這做個紀錄

2018年2月25日 星期日

關於eclipse主題顏色

我依照這篇更改我的eclipse主題,讓白色主題換成黑色
https://samkuo.me/post/2013/10/eclipse-dark-theme/

但有可能系統不一樣或者是版本差異,我選了Dark Juno,Color Theme則選擇RecognEyes

然後有時候變更主題他不會儲存
我會先依照這個更改
https://github.com/eclipse-color-theme/eclipse-color-theme/issues/223

在依照這個
https://stackoverflow.com/questions/30145776/eclipse-color-theme-reverts-to-default-every-time-i-exit

就成功了

2018年2月1日 星期四

重灌電腦加系統複製

因為我灌了一整天,想說紀錄一整天的經驗

1.別用Acronis True Image WD,我弄了一個下午重開機,都沒跑進去系統複製,結果換了一個軟體力馬就行,我用的是MiniTool Partition Wizard Free

複製教學:http://blog.xuite.net/yh96301/blog/394356641-MiniTool+Partition+Wizard+Free+9.1%E8%A4%87%E8%A3%BDWindows+10

然後如果有不要的硬碟要格式化,如果在[我的電腦] 按右鍵 [管理] -> [磁碟管理] 可以格式化,但如果有系統硬碟的話,要用cmd指令

教學:https://www.techbang.com/posts/6982-a-to-delete-a-stubborn-stick-ji-efi-partition-yang-liwei

2017年12月3日 星期日

關於Java queue類說明


Java5中的queue類是隊伍數據結構管理類,
在它裡面的元素可以按照添加他們的相同順序被移除。
使用方法
offer 添加一個元素並返回 如果隊伍已滿,則返回false
poll 移除並返回隊伍頭部的元素 如果隊伍為空,則返回null
peek 返回隊伍頭部元素 如果隊伍為空,則返回null
put 添加一個元素 如果隊伍滿,則阻塞
take 移除並返回隊伍頭部的元素 如果隊伍為空,則阻塞
element 返回隊伍頭部的元素 如果隊伍為空,則拋出一個NoSuchElementException
add 增加一個元素 如果隊伍已滿,則拋出一個IegaISalbEePeplian
remove 移除並返回隊伍頭部的元素 如果隊伍為空,則拋出一個NoSuchElementException



方法\處理方法 拋出異常 返回特殊值 一直阻塞 超時退出
插入方法 add(e) offer(e) put(e) offer(e,time,unit)
移除方法 remove() poll() take() poll(time,unit)
檢查方法 element() peek() 不可用 不可用

但poll和peek方法出錯會返回null,因此向隊伍插入null是不合法的行為。

還有帶超時的 offer和poll方法重載,例如下面的呼叫

boolean result=q.offer(value,100,TimeUnit.MILLISECONDS)

嘗試在100毫秒內向隊伍尾部插入一個元素,如果成功返回true,但當超時進入時會返回false,同樣地,呼叫

Object head=q.pll(100,TimeUnit.MILLSECONDS)

如果在100毫秒內成功地移除了隊伍頭元素,則立即返回頭部元素,否則到達超時,返回null。

阻塞的操作有put和take,put方法是隊伍滿時阻塞,take方法是隊伍空時阻塞。

(阻塞的意思就是此條線程會處於等待卡死狀態,解鎖的條件是隊列中有另一條線程存入或取出數據了,就會解鎖,說白了就是滿了不能再存,空了不能取,都得等著,就相當於隊列是倉庫,倉庫沒有貨了就生產,倉庫有貨就能消費,鎖條件是notFull和notEmpty)

Queue接口和List、Set同一級別,都是繼承Collection 接口,LinkedList實現Queue介面,Queue介面窄化了對LinkedList的方法訪問權限(即是方法中的參數類型是Queue時,就完全只能訪問Queue接口所定義的方法了,而不能直接訪問LinkedList的非Queue方法

JDK7提供了7个阻塞队列。分别是
  • ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列。
  • LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列。
  • PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列。
  • DelayQueue:一个使用优先级队列实现的无界阻塞队列。
  • SynchronousQueue:一个不存储元素的阻塞队列。
  • LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。
  • LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。
參考網站,如有不妥,請告知,立即刪除
http://www.infoq.com/cn/articles/java-blocking-queue
https://zhidao.baidu.com/question/541161936.html
http://www.itread01.com/content/1501578122.html

2017年10月23日 星期一

Word 數字 數值加上千分位和金錢符號$

在某ㄧ次的機遇,我需要把整份Word數值改成有千分位並開頭加上$符號

上網查了一下,幾乎都說要插入Excel,但其實使用Word替代和正規表示法就可以解決了



例如Word有下列ㄧ串數字,則就使用右方格式做轉換

76543210  =>尋找目標([0-9]{2})([0-9]{3})([0-9]{3})   取代為$\1,\2,\3

6543210    =>尋找目標([0-9]{1})([0-9]{3})([0-9]{3})   取代為$\1,\2,\3

543210      =>尋找目標([0-9]{3})([0-9]{3})   取代為$\1,\2

43210       =>尋找目標([0-9]{2})([0-9]{3})   取代為$\1,\2

3210         =>尋找目標([0-9]{1})([0-9]{3})   取代為$\1,\2

210          =>尋找目標([!,$])([0-9]{3})  取代為\1$\2

10       

0         

如果要使用的話,請從上至下開始取代,然後數值為百位數時最好自己手動輸入,因為容易因為其他項目符號,或者是不需要當作金錢的數值,ㄧ起取代掉

2017年7月12日 星期三

Java 對於視窗事件處理流程

有沒有想過,當使用者按下按鈕時,是如何觸發回應視窗,或者是其他動作呢?

一開始我們先記得,在事件處理的過程中,涉及主要下面內容:

1. Event Source(事件源)(Object):事件發生的場所,通常是各個元件,例如按鈕、視窗、選單...等。

2.Event(事件)(Object):當我們對某個元件,做出一些動作時,他會封裝所做的動作相關資訊。

3.Event Listener(事件監聽器)(Object):當有事件源發生事件時(監聽),會對各種事件派送給事件處理器來做相關處理及回應。

4.Event Handler(事件處理器)(Function):當事件監聽器將事件派遣給事件處理器,他會做一連串的回應動作。






















參考:細說Java 8 異常處理與圖形介面程式設計 一書

2017年7月6日 星期四

正規表達式(Regular Expression, regex) for Java


--------------------------------------------------------------------------------------------------------------------------
普通字元組

[0-9], \d    =>比對數字串
[a-z]    =>比對小寫英文字母串
[0-9A-Za-z], \w=>比對數字串、大小寫英文字母串

-g         =>(global) 全域比對,如果沒家只會比對第一個
-i          =>(ignore case) 大小寫不區分
-m        =>(mulltiline) 多行比對

[...]      =>代表那些括號內的字元
[^...]    =>代表不要那些括號內的字元

+         =>代表出現1次以上
*         =>代表出現0次以上
?         =>代表出現0次或1次

\n       =>換行(newLine, ASCII=0x0a)
\t        =>跳格(tab)
\r        =>windows中常接著\n一起代表換行(ASCII=0x0c)
\s       =>空白型字元
\b       =>匹配邊界
.         =>代表任何字母(換行除外)
^        =>不在[...]裡面時,代表字串手
$        =>代表字串結尾

(預設)Greedy   =>貪婪模式會一直匹配下去,直到無法匹配為止
(?)Reluctant      =>勉強模式,只會匹配最少字元。
(+)Possessive    =>只有Java

\X代表不是\x的那些字母
(...)    =>代表一個群組

*可以看這個網頁,補充很多知識
https://atedev.wordpress.com/2007/11/23/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%A4%BA%E5%BC%8F-regular-expression/
--------------------------------------------------------------------------------------------------------------------------

POSIX字元組

e.gs., test1檔案,可以更改1或a來看一下執行結果


--------------------------------------------------------------------------------------------------------------------------



利用Java來練習

e.gs.,
(1).
可以觀看test2檔案執行結果
inputStr="abdZZcdeQQbe";
需找出c或d所在的位置。
regex="[c-d]{1}";
而如果要連續重複兩次的話,則
regex="[c-d]{2}";
matcher的start=5,group=cd;

(2).
可以觀看test3檔案執行結果
來看一下+,*,? 和貪婪模式、勉強模式的差別。


(3).
可以觀看test4檔案執行結果
來看一下group的執行結果,其中他會依序尋找其結果

(4)
可以觀看test5檔案執行結果
用一個簡單的例子,試著抓出他的電話號碼

(5)
可以觀看test6檔案執行結果
找出每個句首大寫的單字

(6)
可以觀看test7檔案執行結果
可以利用此程式,知道該號碼為手機、家裡電話、或錯誤號碼

*
http://notes.maxwi.com/2015/10/06/Regex-practice/
* 如果想看更多範例可以到下面網址
http://www.iteye.com/topic/350789

2016年11月15日 星期二

面試問題

今天面試考白版題,整個頭腦轉不過來...就只好回家檢討一下問題了

1.寫出一個反轉字串的方法

2.一樣是反轉字串的方法,但不行使用迴圈的方式

這部分我分兩個...一個是我自己寫的,一個是看網路上比較簡易的==

2.1

2.2

然後需要檢討時間複雜度和空間複雜度的運算和StringBuffer...完全忘記了,這部分下次再補齊

補充知識

今天和一個朋友聊天,聊了很多知識東西,我想要把它記下來和補充


1.Override and overload的差別

override:子類別繼承父類別的函式,然後改寫其繼承的函式,但必須是函式名稱相同、參數型態個數相同,傳回型態相同。

overload:相同的函式名稱,但參數型態、參數個數、傳回型態只要任一個不同,就會呼叫不同的函數。

2.IO dead lock 是什麼,如何處理?

process的通常流程=要求資源->使用資源->釋放資源

而dead lock通常要滿足下面條件

  a.Mutul exclusion:一個資源(Instances)一次只能被ㄧ 個process使用。

  b.Hold and wait:當多個process發生mutul exclusion,然後尋求下一個資源時,都有process在      使用,造成一個等待資源動作出現。

  c.No preemption:而資源又不能經過其他方法來釋放,只能依靠使用的process來自行處理。

  d.Circular wait:就造成每個process都握有另一個process請求的資源,然後各自沒有釋放本身      持有的資源,造成一個循環出現。

那我們該如何處理
  a.完全無視他...反正出現死結機率很低,大不了重開機或重開程式讓他重新來過就好了...

  b.偵測死結發生,然後經由自己寫的程式邏輯來恢復運作。

  c.使用一個protocol來預防或避免死結發生。

3.繼承、封裝、多型,如何用最普通的講話來解釋?

因為我只會實作,真的沒想過如何用普通的講話說出來,我這裡試著用我想法講出來

這裏我舉一個汽車工廠的例子

當母公司做了一個汽車模組出來分送給底下的子公司,然後子公司依照所待的國家區域,來做調整,例如是顏色問題、燈的明暗度、和左右邊駕駛問題,而這就是「子繼承父」的觀念了。

而封裝就像是避免存取一些你不想讓人知道的東西,舉個例子來說,每個汽車裡都有一個微電腦,而開發汽車微電腦的人,不想有人亂動裡面機密的設定,避免造成車禍事件發生,所以他們就只提供,供應微電腦的電源連接器、微電腦輸出設定到儀表板上,而微電腦就是被封裝的東西,而電源連接器和輸出設定就是提供微電腦的介面方法。

多型,我就在繼承的例子,再改一下,當母公司做了一個汽車模組設計圖,而這個汽車模組設計圖依照各個國家、地區、氣候、政治的不同,有不同的設計成品出來,而這些設計成品的原型是從「同一個名稱的汽車模組設計圖」出來的。

4.Clean code and dirty code

dirty code指的是讓人覺得很難看得懂的程式,有可能是重複宣告、同樣的程式碼、髒亂的排版、沒有註解...等等,而會造成這個原因有可能是自身實力不足或者是為圖方便之類,從而造成程式碼越來越髒、當越髒時Bug也會越多,因為當你看不懂時就會亂改參數或者是重新寫一個新的,而通常這都會造成下一個問題出現,因為你看不懂程式碼,無法全面觀察改變之後會造成什麼事情出現,而clean code就是除去這些問題所寫的完美程式碼,我這裡推薦兩個網址,這裡詳述一些dirty code的問題。
http://www.ithome.com.tw/node/83209
http://keystonegame.pixnet.net/blog/post/17243817-%E7%A8%8B%E5%BC%8F%E7%A2%BC%E5%A3%9E%E5%91%B3%E9%81%93(code-bad-smell)

5.IPv4 Internal IP

6.Agile Scrum


參考資料:
http://sls.weco.net/node/21327
http://www.ithome.com.tw/node/83209
http://keystonegame.pixnet.net/blog/post/17243817-%E7%A8%8B%E5%BC%8F%E7%A2%BC%E5%A3%9E%E5%91%B3%E9%81%93(code-bad-smell)
https://toggl.com/developer-methods-infographic


2016年10月11日 星期二

C/C++ call by value, call by address, call by reference

標頭都加上
#include <iostream>
using namespace std;
然後使用dev c++

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

int main()
{
  int i=1;
  cout<< i <<endl;  // print 1
}

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

int main()
{
  int i=1;
  cout<< &i <<endl; // print i address
}

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

int main()
{
  int i=1;
  int &j=i;  //讓j的位址指向i的位址(兩個位址會一樣)
  cout<< j << endl; //print j values (That is i values)
  cout<< &j << endl;  // print j address (That is i address)
}

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

int main()
{
  int i=1;
  int *k=&i; //讓k的變數參照i的位址(兩個位址會不一樣)
  cout << k << endl;  // print k values => i address (所以k變數數值列印出來是i的位址)
  cout << &k << endl; // print k address (是指k的位址,不關變數i的事情)
  cout << *k << endl; // print i address pointer values (指的是,k指標變數所參照i位址的數值)
}

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


2016年10月7日 星期五

eclipse java project 應用於XAMPP MySQL

因為我是第一次用jdbc,所以就在這記錄一些事情


首先下載mysql-connector-java-XXXX-bin.jar

download link:http://dev.mysql.com/downloads/connector/j/


然後add external jars,把jar檔放入

之後試著寫一段程式連接

會發現出現一個錯誤
ClassNotFoundException:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

是因為MYSQL 預設是不允許通過遠端存取資料庫

所以必須在mysql command下指令:

1.改表

use mysql;
select user,host,password from user;

update user set host='%' where user='root';

2.授權法

grant all privileges on *.* to 'myuser'@'%' identified by 'mypassword' with grant option;

或者是特定主機才可以連線

grant all privileges on *.* to 'myuser'@'192.168.1.3' identified by 'mypassword' with grant option;

然後重開mysql,之後就能成功存取了


再來下面是實作結果
reference:
https://blog.yslifes.com/archives/918
https://my.oschina.net/weiweiblog/blog/664373

2016年9月30日 星期五

Java 關於ArrayList 深度複製

自從學會ArrayList泛型使用,我就開始愛上他來做陣列使用。

簡單的泛型使用類似下面code,第一段是簡單的int泛型,第二段是int[]的陣列。

然後ArrayList也能使用物件來當參數,例如下面:

ArrayList使用容易,也很好分辨

如果你要複製一樣的ArrayList,可以用以下的式子
但是,如果你是使用ArrayList<陣列 or 物件>,你就要特別小心了

例如下面

可以發現到當arrayList改變時,arrayListCopy數值也會跟著改變,是因為ArrayList是淺度複製,當參數是單純變數時(例:int, String, boolean),複製的arrayListCopy不會改變,但當參數是陣列 or 物件,ArrayList<int[]> arrayListCopy=new ArrayList<int[]>(arrayList); arrayListCopy 和 arrayList指向的是同一個記憶體位置,所以會造成某個ArrayList改變時,另一個就會跟著改變。

而如果要簡單解決這問題的話,只要做下面的方法就行了:
ArrayList<int[]> arrayListCopy=new ArrayList<int[]>(arrayList);
改成
 ArrayList<int[]> arrayListCopy=new ArrayList<int[]>();
    
 for(int[] copy:arrayList)
 {
    arrayListCopy.add(copy.clone());
 }

    

一個一個陣列把他複製下來。

也可以使用 BeanUtils.cloneBean來把它複製。