AllenHsu的技術手扎

學海無涯,努力做個永遠年輕的人

Rxjava的線程切換與異步操作

傳統Android開發中,我們可以透過Handler/Thread等方式來做異步操作,那在RxJava中,假設我們想要做Thread的切換我們應該怎麼做呢?基本上是透過 observeOnsubscribeOn 這兩個操作符,去實作所謂的線程切換與異步操作。

observeOn 與 subscribeOn 。

什麼是 observeOn :

specify the Scheduler on which an observer will observe this Observable

指定一個觀察者在特定的 Scheduler 上觀察這個 Observable 。

什麼是 subscribeOn :

specify the Scheduler on which an Observable will operate

指定這個 Observable 自身在哪一個特定的 Scheduler 上操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

Observable.just(1)
.map(integer -> {
Log.i("Rxjava", "map-1:"+Thread.currentThread().getName());
return integer;
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.newThread())
.doOnSubscribe(s -> {
Log.i("Rxjava", "doOnSubscribe:"+Thread.currentThread().getName());
})
.doOnNext(next -> {
Log.i("Rxjava", "doOnNext:"+Thread.currentThread().getName());
})
.subscribe(
x -> {
Log.i("Rxjava", "next-1:"+Thread.currentThread().getName());
}
);

以上面的代碼為例子,map的操作符會在newThread做操作,doOnSubscribe/doOnNext 都會在 mainThread做操作,透過這樣兩個簡單的操作符可以很簡單的去做Rxjava的線程調度。

Solidity函式常見修飾符

在Solidity中有幾個常見的函示修飾符,這邊就來簡單介紹一下

Imgur

  • public : 所有人都可以呼叫這個函式。

  • private : 只有合約能夠呼叫這個函式。

  • view/constant : 只會回傳資料,函式也不能修改任何變數或合約資料

  • pure: 不能修改,也不能讀取合約內的資料。

  • payable: 當有人呼叫該函式,他們可能會發送 Ether。

  • returns (type) : 指該函式需要返回值,type為返回值的類型 。

Solidity 0x1

Solidity是什麼 ?

根據維基百科描述,

Solidity logo.svgSolidity的標誌
網站 github.com/ethereum/solidity
啟發語言JavaScript, C++, Python, PowerShell

Solidity是一種合約導向式語言,可被應用於各種不同的區塊鏈平台上[1],其主要開發者為Gavin Wood,Christian Reitwiessner,Alex Beregszaszi,Liana Husikyan,Yoichi Hirai和其他幾位早期以太坊核心貢獻者。[2][3]Solidity 可使程式開發人員能在區塊鏈上(例如以太坊)編寫智能合約

  • Strongly Typed - 屬於一門強型別語言
  • Similar to Javascript - 與Javascript非常類似(指的是syntax部分)。

###Solidity 在 與智能合約。

Imgur

我們使用 Solidity 編寫完的合約,透過 Solidity Compiler 會編譯出兩個文件,分別是 Byte codeABIByte code 的文件將會被部署上 Ethereum Net ,所以真正在區塊鏈上的文件是 Byte codeABI 對於編寫可以與智能合約交互的應用程式來說,是非常重要的。

舉例來說 :

Imgur

我們在部署完智能合約之後,我們會需要透過Web前端,裡面會有一些Javascript的代碼,作為交互使用,Javascript並沒有能力能夠直接與 Bytecode 進行交互。我們就需要透過 ABI 與區塊鏈上的智能合約(ByteCode) 與其溝通而拿到目前智能合約內儲存的狀態或資料。

###Solidity IDE - Remix

Remix 是一個 Solidity Online的 Editor,可以用來編寫與測試 Solidity,也可以在上面直接發佈智能合約。

第一個智能合約 - 使用 Solidity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 //每一個智能合約都必須定義,這邊指的是使用0.4.17或更高的編譯器版本
pragma solidity ^0.4.17;

//contract的修飾符關鍵字就像class一樣,定義這是一個合約
contract Inbox {
//在這個合約裡面儲存一個string,並且是public,任何人都可以知道這個變量
string public message;
//建構子,當這個合約被部署到區塊鏈上,會執行這個函式。
function Inbox(string initialMessage) public {
message = initialMessage;
}
//改變這個合約中的message變量。
function setMessage(string newMessage) public {
message = newMessage;
}
//取得這個合約中的message變量。
function getMessage() public view returns(string) {
return message;
}
}

這樣就完成了一個簡單可以在區塊鏈上儲存字串訊息的智能合約。

Blockchain 0x1

2018年算是區塊鏈(Blockchain)最火紅的一年,因為比特幣以及虛擬貨幣的市值大漲影響,所以連帶了讓 Blockchain 這個技術像閃電般的出現在眾人眼前,但是大家對於區塊鏈的理解大部分都落在比特幣以及加密貨幣,但是其實加密貨幣只是區塊鏈這個技術的應用之一,所以區塊鏈到底是什麼 ?

用一句最簡單的例子來解釋,『區塊鏈是一個去中心化的分散式資料庫的技術』

每筆資料都會被寫錄在每個區塊中,而每個區塊中都有完整且相同的資料庫。由於每個區塊節點的資料庫都是相同的,由於上述的特點,所以區塊鏈有幾個最重要的特色。

  • 去中心化。

    • 使用者不需要依賴任何的第三方管理機制或硬體雲端服務器,而是依賴分散在網路上各個完整個區塊節點,每個節點都擁有驗證、傳遞以及管理的能力。
  • 不可竄改性。

    • 區塊鏈透過密碼學的方式來保證每個區塊節點上已有的數據都不可能被串改。
  • Merkle Tree。

Read more »

每個月和自己來一場 檢討會議

今天看到一篇文章蠻好的,順道記錄一下在這邊,給自己更有方向跟執行力,每天都忙到焦頭爛額的,好像可以好好透過這些方法讓自己更有目標與活力。

小時候,喜歡的是什麼?

小時候,任誰都會遵照WANT TO=想做的事 行動。可是隨著年紀增加, HAVE TO=非做不可的事 占據了內心,這個問題是要讓 WANT TO 從我們的內心深處甦醒。

如果沒有限制,期望的是怎麼樣的未來在迎接未來的你?

思考「自己想變成怎樣?」時,身邊會有各種條件,難以自由地發想。所以,會忍不住依賴過去的經驗和記憶、現在的狀態和情勢,預測、計劃未來。這個問題會讓你想起「未來在尋求什麼?」

什麼時候最耀眼,最開心?

光是訴說、寫下燦爛耀眼的人生高潮,自己當時的心情就會復甦,體溫上升,心情亢奮。那是一直推動往後人生的重要記憶。請經常想起,表露於外。

人生最痛苦的時候,是怎麼重新站起來的呢?

一旦說起痛苦的事實, 幾個小時都不夠。所以,請只想起「重新站起來的方法」。這個方法中,會有讓你進前的啟發。說不定也能以那個方法,解決眼前的問題

有30個你不認識的人。和他們打成一片的過程中,你會想替他們做什麼呢?

互不相識的一群人待在同一個房間。而隨著時間的經過,感情漸漸變得融洽。你想替所有人做的事情,就會是你最愛、擅長的事,因為這才能讓所有人開心。

自己擅長的事是什麼?不擅長的事是什麼?

擅長的事對你而言,是簡單的事。你可能會覺得這麼簡單的事,誰都做得到。不過,如果試著問熟人你擅長的事,說不定對方的答案會令你意外。不擅長的事是什麼呢?任誰都能輕易地回答這個問題。因此,要再附加一個問題。「擅長你不擅長的事的人是誰呢?」你身邊會有人對這件事感到開心。你不擅長的事,有可能是某人擅長的事。請誇獎、委託對方,使對方發揮那項能力。

這個問題好難,因為感覺我現在不知道自己擅長些什麼。

該請誰幫忙呢?

諸事不順的人,總是想靠自己一個人設法解決問題。相對地,諸事順遂的人會習慣借助別人的力量。

臨終時,你會後悔什麼呢?

如果平常過得很忙碌,就很難把時間用在重要的事情上。可是,假如想像已經「沒有」時間了的那一瞬間,你的心情如何呢?半途而廢的事情當中,什麼令你最後悔?回答這個問題之後,眼前的現實會看起來不一樣,或者判斷的標準會改變。

這個問題也很難,感覺我的人生都在後悔中度過。

你現在想見的人是誰?

每天和一樣的人見面,很難和想見的人共度時光。可是,現在有該見面的人。有人該去見好幾次。這是人生的陷阱。那是誰呢?光是在腦中搜尋就會心跳加速。

你在人生中的什麼時候實現了夢想?

在考試、感情、工作、運動、家人方面,實現了夢想,達成了目標。請試著想起當時湧現心頭的情緒。再度模擬體驗成功的事,會強化「實際行動就能實現」這種心情。

人生中最耀眼那一瞬間的情緒「在體內的哪一帶?呈現什麼形狀?顏色?溫度?硬度?」

重現實現夢想、達成目標時的情緒,經常會產生好結果。

###「目標是什麼?」「什麼進展順利?」「什麼進展不順利?」「所以該做什麼呢?」「透過這些問題,獲得了什麼呢?」

光是忽然對自己拋出問題,就能整理心情。

參考出處

開始與結束

轉眼間2017年又要過了,過去每年嘗試著盡量在一個月寫一次的技術Blog,不管是給自己或者給別人看,中間也參考許多別人的技術Blog,希望可以透過寫作的方式提升自己對於技術的理解跟提升自身的技術、閱讀、寫作的能力,雖然還是很懶,不過總算是有了個開始,所以這篇是2017年對自己的年度回顧與檢討,希望在2018年可以再讓自己不管在工作、學業、感情、各方面都能更有成長。所以透過想做的事情已完成的事情沒有完成的事情來做個總檢討與2018年的展望。

2017想做的事情/已完成的事情/沒有完成的事情

  • 刺青 - 完成
  • 學會斜跑(衝浪的技巧) - 沒有完成
  • 考上北科在職專班 - 完成
  • 寫技術Blog - 完成(進行中)
  • 看完40部電影 - 完成(但不完美)
  • 看完10本書 - 沒有完成(7本)
  • 雅思考試 - 沒有完成

回顧來看,除了最後兩項沒做到之外,前面的事情都做完了,沒有想到的事情是竟然10本書沒有看完,40部電影不出意料的都看完了,但是沒想到留在我腦海印象中的卻不多,刺青算是對自己身體與心靈上的一種特別意義,主要還是 學會斜跑北科在職專班、這兩件事情特別仔細來回顧一下好了,先從斜跑這項運動 - 衝浪 開始談起好了。

關於衝浪

很有趣在2016年因緣際會接觸了衝浪這項運動,當初其實並不是真心對於這項運動的熱愛,而是某些需要轉換心境的原因,而衝浪是非常耗費體力的一項極限運動,所以剛好就成了一個發洩的出口,然後一開始又被周遭同好推坑,所以變成一開始就挑戰難度極高的短板,這邊就不詳述衝浪活動要幹嘛了,有興趣的人在自己google了,從一開始的連在板子上都無法平衡,也不會 潛越越浪 一直被浪打回來,到能夠划水到 outside 區,然後在板子上努力學著如何 坐板 平衡,然後努力的划水追浪 , 到可以起乘站到浪板上 ,這中間看起很簡單的過程,但是卻整整花了我一整年(2016年9月到2017年9月),中間一度有想放棄過這項運動,但是衝著衝著卻發現,我喜愛台灣的海洋,它可以很美麗,也可以很凶險,與衝浪同好坐在海上觀浪邊聊天,看著海平面上陽光與海洋彼此襯托,從每次越浪嚐到的海水苦鹹,到坐板觀浪的耐心等待,至最後的划水追浪至起乘衝浪,這樣子的一次又一次嘗試,一次又一次的失敗,讓我能夠感覺到自己好像真正的活著,雖然我現在還是衝得很爛,不太會觀浪,滑水不夠快,但是我還是希望能夠去用身體感受這片土地與海洋帶給我們的美好。

關於在職專班

這項也是很有趣,當初只是想讓自己忙碌一點,沒想到到最後變成工作學業蠟燭兩頭燒,在北科大中,認識了很多業界的同學,更讓自己感到自己的渺小,與自己唸書方式的不足,雖然是完成了考上,但是要到畢業可能還需要一段努力,這邊給我最大的收穫算是要去如何學習跟管理自己的時間,如何好好分配工作與學業的比例,以及上課時的吸收,由於是碩班,還有閱讀英文文章論文的能耐,我想都是在2018年非常好的課題。

2018年想做的事情

還是回歸到這個Blog的本質,技術,在2017年算是轉換了一個不小的跑道,在管理方面也第一次嘗試管理15個人,這邊大概只能給自己打個60分,技術方面也碰觸了很多,像是 Android/iOS 更深一步的原生開發,新型的框架實現(MVVM),FRP(RXJava)等,算是對自己一個不小的挑戰,在這邊給自己2018年的期許。

  • 技術方面 :
    • iOS : RxSwift、如何讓iOS與Android共用類似框架開發、ReactNative的學習。
    • Android : 如何讓iOS與Android共用類似框架開發、ReactNative的學習、Kotlin的邁入。
    • Web : 可以寫出一個簡單的Sideproject。
  • 學業方面 :
    • 投稿演討會論文。
  • 個人精進方面 :
    • 看40部電影(寫出5部的心得,因為今年看完40部留在腦海的卻沒幾部)。
    • 看5本書(一樣需要寫出心得)。
    • 斜跑穩定(今年斜跑算是有成功幾次,但是並不穩定)。
    • 英文能力的提升(雅思今年報考,且分數在5以上)。

總結

今年學習到了目標不是訂的大,訂的好跟自己能夠負擔,以及執行力才是最重要的,希望2018明年的我,看到這篇文章是能夠自豪的感覺都有把事情做完,而不是到了2018又發現自己成效力不佳,這是給自己2018年最大的課題。

執行力

MVVM是什麼 ? 能吃嗎 ?

在做軟體開發的時候,常常會使用一些設計模式去做系統架構的開發與設計,像是常見 Model-View-Controller (簡稱 MVC )、觀察者模式、代理模式等等,透過這些設計模式,更能有效的使我們的軟體架構增加可讀性以及擴充性。

MVVM 又是什麼呢 ? 在 iOS/Android 的開發中,我們遵循的是最常見的 MVC 開發模式,在 iOS/Android 中,通常 Stroyboard/Xib/Xml 為我們的 View 層級,負責作為顯示跟介面上的邏輯,ViewController/Activity/Fragment 做為 Controller 層級,Model 則為存取資料的層級。

不過常常我們會需要在 ViewController/Activity/Fragment 當中去操作對 View 的相關處理,而不光是只控制 App 的流程及邏輯,那是因為不管在 iOS/Android 的設計中,ViewController/Activity/Fragment 也被用來當成 View 的一部分,由於模糊不清的權責,讓我們常常寫出一個極致複雜的 Controller 類別 - Massive ViewControler

為了解決這個問 題,有許多人提出了各式各樣的 MVC 變形設計去解決,而 MVVM 就是其中的一種。

Read more »

Dagger2 起步走

在上一篇簡單談論了 Dependency Injection 以及 Dagger2 的一些基礎,接下來就要用實例來告訴大家怎麼使用 Dagger2

這裡先假設一個業務場景,我們在 BaseActivity 需要建立一個網路連線 NetworkManager 去跟後台做API的串接,這裡先不考慮其他架構性的問題,只希望能簡短的用一個實例來跟大家講解。然後我們為了再深入說明 Component 之間的依賴關係,NetworkManager 建構需要依賴一個 HttpConnect 對象。

Read more »

關於依賴注入

在談 Dagger2 之前,我想先簡單介紹一下關於 依賴注入 。什麼是依賴注入? Dependency Injection (依賴注入) 簡稱 DI,用來降低程式碼的耦合度所使用。

當我們今天有一個 Class A 用到了 Class B 的物件,一般情況下,需要在 A 的代碼中顯示的 new 一個 B 的物件。這樣子Class A 的建構就依賴於 Class B了,
當我們實現依賴注入之後 A 的代碼只需要定義一個私有的 B 物件,不需要直接
New 來獲得這個物件,而是透過相關的容器控制程式來將 B 物件在外部 new出來並注入到 A 類裡的參考中。

依賴注入有如下實現方式:

  • 基於介面。實現特定介面以供外部容器注入所依值型別的物件。
  • 基於 set 方法。實現特定屬性的public set方法,來讓外部容器呼叫傳入所依值型別的物件。
  • 基於建構函式。實現特定參數的建構函式,在新建物件時傳入所依值型別的物件。
  • 基於註解。基於Java的註解功能,在私有變數前加「@Autowired」等註解,不需要顯式的定義以上三種代碼,便可以讓外部容器傳入對應的物件。該方案相當於定義了public的set方法,但是因為沒有真正的set方法,從而不會為了實現依賴注入導致暴露了不該暴露的介面(因為set方法只想讓容器存取來注入而並不希望其他依賴此類的物件存取)。
Read more »

前言

設計模式 中, 一個最基本的原則 少用繼承,多用合成 。所以我們有了 Strategy Pattern (策略模式) 和 其他有用的設計模式,在這邊主要是想要談如何透過 Swift 來實作策略模式。

Read more »
0%