原创 【Java】byte 到 unsigned byte (int) 轉換

Java中處理io時,經常需要將read()所返回byte轉換爲unsigned byte,但由於Java並不存在無符號的數據類型,我們值得將其轉換爲int,而這僅需一條很簡單的語句變可搞定: int unsignedValue

原创 Android P 源碼分析 2 - 強弱指針的實現

繼上篇我們學習了 Android 輕量級指針的實現,是時候來看“重量級”指針的實現了。在 Android 裏,“重量級”指針指的是 RefBase 和 sp/wp 配合使用的情況,它提供了完整的強、弱指針的支持。 考慮這樣一種情況

原创 Android Pitfall - Fragment.startActivityForResult(), requestCode == 65536

Android裏,Fragment和Activity具有 startActivityForResult() 方法,但在支持庫裏,二者的表現卻會有很大差異。 假定目前使用的是Android支持庫(Support library),我們在F

原创 kotlin 協程上下文那點事

用線程做類比的話,協程的 context 可以認爲是協程的“線程私有變量”,同時這個私有變量是不可變的。也就是說,我們在創建一個協程的時候,他的 context 攜帶的信息就已經確定了下來。由於協程是很輕量的,在需要改變協程上下文

原创 Kotlin 協程到底運行在哪個線程裏

與其說協程是一個輕量級線程,我更願意把它當然一個個待執行/可執行的任務。這樣就引申出一個問題——協程是運行在哪個線程上的?這就是本篇文章想要探討的問題,同時我們也將學習如何讓協程在特定的線程裏執行。 首先來看一個例子: fun l

原创 OpenGL ES 3.0 學習 —— 繪製一個三角形

在 上篇 我們使用 OpenGL ES 3.0 給 GLSurfaceView 繪製了一個背景色,現在是時候更加一步了,我們來畫一個三角形。 首先,我們來了解一下什麼是圖形管線(graphics pipeline)。GPU 把繪圖的過程分

原创 OpenGL ES 3.0 學習筆記 2 —— 給 GLSurfaceView 畫一個背景色

好吧,我承認,就畫個背景這也太無趣了。但萬事開頭難,我們還是從最簡單的開始吧。 Android 從 4.3 版本開始就支持 OpenGL ES 3.0,目前而言,絕大部分 Android 設備的版本都是高於 Android 4.3 的

原创 Android - 聊聊 Service

學習 Android 應用開發時,我們首先接觸到的是 Activity。簡單地理解,一個 Activity 就是 Android 應用的一個頁面。而在某些情況下,我們可能需要在“頁面”不可見,仍然執行某些操作。這個時候,我們就需要 Ser

原创 Java - synchronized 那些事

由於功率牆的影響,現代 CPU 傾向於使用多個核心(core)來提高其整體性能。這意味着,軟件開發人員不再能夠像以前一樣,把軟件放兩年,再拿出來,它的性能就變得足夠好了。爲了充分利用多核 CPU 的能力,我們也必須進入多線程編程的世界。

原创 自己實現 SharedPtr(3)—— 進一步的轉型(cast)支持

在上一篇文章中,雖然我們實現了一部分的類型轉換支持,但是,我們並不能滿足於此。既然我們的類叫做“SharedPtr”,那麼,用戶就有理由期望他的某些行爲,能夠和真正的pointer一致: // Raw pointer Derived* p

原创 OpenGL ES 學習筆記 1 —— OpenGL ES 版本檢查

首先,我們明確兩個術語: OpenGL, Open Graphic Library,是一個跨平臺、跨語言的2D、3D圖像編程的規範。 OpenGL ES,ES 表示 Embedded System(嵌入式設備),可以認爲是用於嵌入式設

原创 自己實現 SharedPtr(2) —— 類型轉換、copy/move 語義的實現

由於今天還是繼續在做萬惡的(Android的)recovery升級,而每次編譯都要半個多小時,然後就抽空又來寫了一點點代碼。 在進入正題之前,先對之前的代碼做一點小小的改動: 1. PointerDeleter 類不再是模板而直接使用外

原创 自己實現 SharedPtr(1) —— 管理 Deleter

從去年(2015年)開始,就斷斷續續看過不少C++相關的書,可是由於個人的一些壞習慣,卻一直都沒怎麼的用過。以至於學了忘,忘了學。所以呢,現在就想着自己造一下輪子,練練手。折騰了一個上午,也就有了這麼一篇文章。 首先,模板是標配,所以就有

原创 Widget&& w{} 究竟表示什麼?這跟 std::forward 又有什麼關係

首先我們來看這麼一段小程序: class Widget { }; void f(Widget&) { cout << "f(Widget&)" << endl; } void f(Widget&&) { cout <<

原创 分享一道伯克利 CS 61A 關於高階函數的一道Python作業題(2)

這裏,我給出個人對於上一篇文章中題目的一種解答。 首先,對於 one two這兩個函數的定義,這個對於很多人來說,應該是沒有什麼難度的。根據successor的定義,我們可以得到下面兩個函數的定義 def zero(f): ret