Cody Blog

2017 黃金海岸馬拉松

start

2017.7.2 黃金海岸馬拉松是我的第四馬,也是我海外的第二馬。2017年黃金海岸馬拉松全馬人數大約6千人,相比於我的上一場海外馬-東京馬的2萬多人,算是比較小型的賽事,不用人擠人又可以享受 IAAF Road Race 認證金牌規格賽事。這個賽事最大的特色就是全程 42 公里幾乎都是沿著海岸線跑,可以邊跑邊欣賞海岸線的美景。

gold-coast

這次比賽前一個月的練習跑量大約是150公里。雖然不多,但我的目標就是希望比2014東京馬5:56記錄進步,然後不要受傷。賽前狀況都還不錯,沒有特別酸痛或是受傷的情況,我也臉書上面宣告我的目標成績為 5:30: target-530

黃金海岸馬拉松的賽道相當平坦,補給方面大約2.5公里就有一個水站或是水+運動飲料站,直到30公里才會有能量膠的補給。只是接近中午的時侯會有很大的太陽,氣溫偏熱。

route

start 依照賽前填的預估時間,我被分配到最後一區 ZONE D

start-2 槍響之後沿著人群慢慢前進

che-ming 這次跟從凱恩斯來的新朋友哲明一起出發,這天也剛好是他的生日,他說他想要黃金海岸馬拉松來當成他的生日禮物,這是他的初馬。

start 我們一開始設定一公里7分鐘的速度前進,跑著跑著,看著5小時的紅色配速員的氣球連我們愈來愈近。我評估了一下自己的狀況,呼吸都還很輕鬆,於是我們開始跟著5小時晶片時間的配速姐。

teresa-500

配速姐出發沿路都放著音樂,蠻有激勵人心的效果

8k

第一個折返點

start

turning-point

沿路幾乎沒有私人補給,跟台灣、東京馬的賽事不同。這就是馬拉松文化的差異,澳洲民眾會很熱心幫你吶喊加油,不過沒有食物補給的習慣。整路我只有看到在 Suffers Paradise 看到有女生拿可樂跟巧克力分送給跑者。不過因為我事前就知道會有這樣的情況,出發前就準備了6條GU能量膠帶在身上。

marathon-man 澳洲人的跑馬數量的記錄保持者Trent Morrow,這是他的第313馬,他曾在2013年,單年跑了161場全馬的驚人記錄。

cheer-4

賽道旁邊有很多加油的名眾,因為號碼布上面有自己的名字,所以很多人會直接喊你的名字幫你加油。 像是 Cody!! Keep going !!

cheer-1 cheer-3

x

26 K 之後天氣愈來愈熱,

justin

連配速哥都沒辦法維持均速停了下來。最後晶片時間的配速姐幫忙了槍聲時間的配速哥,幫忙他完成接下來的配速。

img

而在這邊真的愈來愈難跑,因為我就把手機收了起來 …

Data Sharing between Fragments and Activity

Source: Data Sharing between Fragments and Activity in Android - Stack Overflow

Activity -> Fragment [prefered]

In your activity : create a bundle and use:

fragment.setArguments(bundle)

In your fragment : use Bundle bundle:

getArguments()

Activity -> Fragment

In your fragment : create a public method

public void methodForActivity(...) {
    ...
}

In your activity : call an active fragment public method :

getSupportFragmentManager().findFragmentById(R.id.your_fragment).publicMethod(args)

Fragment -> Activity [prefered]

In your fragment, create an interface with getter and setter methods to hold the interface reference which will be implemented by the activity.

In your activity, implement the interface, and using the setter method to pass self …

British English Pronounciation Notes

The followings are notes from BBC - The sounds of British English. I listed all the example words so that we can reference it quickly if we have a doubt about the pronouciation.

Short Vowel

ɒ

lot, odd, wash

ɪ

kit, bid, hymn, minute.

ʊ

foot, put, good.

ʌ

strut, mud, love, blood
ʌ, æ: undle, ankle; bunk, bank; but, bat; cup, cap; swum, swam

ɛ or e

dress, head, bed, many ɛ, ɪ: bed, bid; medal, middle, dead, did, fell, fill, pen, pin ɛ, eɪ: bed, bay

æ or a

trap, stamp, back, lap, dad

ə - schwa

a, the, of …

Pass an object between activities on Android

Passing an object from between activities needs some extra efforts, there are at least three ways to archive this goal:

  1. Using a serializable interface
  2. Using a parcelable interface
  3. Using Google's Gson library to convert from an object to a JSON string

Scenario

For instance, passing two strings to another activity could be archived like this:

Intent intent = new Intent(context, SecondActivity.class);
intent.putExtra(KEY_DOG_NAME, dogName);
intent.putExtra(KEY_DOG_OWNER, dogOwnerName);

If there are too many parameters, we can encapsulate them into a dog object:

public class Dog {

    private String mName;
    private String mOwner;

    public Dog(String name, String owner) {
        this …

Parsing JSON string on Android

Given a json string, you could convert it to either JSONObject(str) or JSONArray(str). For example, This json response is from weather forecaset server:

http://api.openweathermap.org/data/2.5/forecast/daily?zip=545%2Ctw&mode=json&units=metric&cnt=7&appid=aa032e548c67daa9cd1bc64eec737960

The response json format is like this:

json

If you want to get the first max temperature value: 17.06:

    JSONObject weather = new JSONObject(weatherJsonStr);
    JSONArray daysWeather = weather.getJSONArray("list");
    JSONObject dayWeather = daysWeather.getJSONObject(0);
    JSONObject dayTemperature = dayWeather.getJSONObject("temp");
    int maxTemp = dayTemperature.getDouble("max");

Note that there may has a JSONException when the json tring …

How to storing api keys in Android

You SHALL not save api key into version control system, but how can you manage your API keys?

There are some approaches had been discussed here. One is to saving the api key in gradle.properties. Before add secret to this file. you need add gradle.properties to .gitignore file. If you already commited this file to your git. remove gradle.properties from git first by this command:

git rm --cache gradle.properties

Next, Open your gradle.properties and appmend a new line:

yourapikey="THIS IS API TOKEN"

Modify build.gradle and add buildConfigField for your api key

android {
    compileSdkVersion …

Permission model in Android 6.0

在 Android 6.0 之後,有了新的 permission model, 安裝 App 的權限可以不用在 Google Play 安裝的時侯就授權。而是等到使用者要使用這個功能的時侯,再詢問使用者。而權限分成兩種: normal permission 跟 dangerous permission 兩種。 normal permission 可以直接在 AndroidManifest.xml 直接定義,不會詢問使用者就可以直接取得權限,像是android.permission.INTERNET權限就屬於此類,主要是跟使用者的隱私比較無關的功能。如果想使用權限是屬於那一類的話,可以參考這個清單

檢查權限

首先都要先檢查是否有這個權限:

ContextCompat.checkSelfPermission(Context context, String permission)

例如,檢查是否有寫入行事曆的權限

ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR);

回傳值有兩種可能: PERMISSION_GRANTED(0)PERMISSION_DENIED(-1)

範例程式1: 請求單一權限

private static final int REQUEST_PERMISSION = 1;

private boolean checkPermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        final String permission = Manifest.permission.PERMISSION_YOU_WANT;
        if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
            if (shouldShowRequestPermissionRationale(permission)) {
                AlertDialog.Builder builder = new AlertDialog.Builder(this …

Send HTTP Request in Android

In the most of time, you could just use HTTP library like Volley or OkHTTP. If you want to use native Android function call for some reasons, you should use HttpURLConnection. HttpClient has been deprecated since Android 6.0(sdk 23).

For HttpURLConnection , there is an excellent code snippet on here

Note: Android don't allow network request happened on main UI thread. If you did this, a android.os.NetworkOnMainThreadException exception will be thrown out. Put them in AsyncTask or Service instead.

Build Url:

Uri.Builder builder = Uri.parse(FORECAST_BASE_URL).buildUpon();
urlBuilder.scheme("http");
urlBuilder.authority("api.openweathermap.org");
urlBuilder …

初級日文學習回顧

a-1

學一個新的語言

今年7月到9月,我到了東京長沼日本語學校學習初級日文。除了上課的200個小時,加上課餘復習,這3個月的時間我至少投入了400小時在日文學習上。

第一次到外國學語言,也是第一次我在國外住了3個月。語言學校學習的好處就基本上整天都是全日語的環境。因為我們是初級班,大家會的日文很有限,一開始的下課,大家還是都用英文來聊天,但隨著學習到的日文愈來愈多,也就發現大家慢慢可以用日文來溝通了。

到語言學校學習可以很容易進入說日語的環境。學習新語言的過程其實就是要不斷的模仿、犯錯、修正。而語言學校則是一個安全、比較沒有壓力的環境,例如學到購物的日文時,就可以到學校的咖啡廳練習。在有系統的教學框架下按步就班學習,絕對會自己在學來得有效率。

不過上語言學校最大的缺點就是很貴。但換個角度想,也是因為自己投入了這些金錢跟時間。代表自己有這個決心來學習一個新的語言。所以我的心態就是既然來了,就好好學習,不要浪費。一個月約2萬5台幣的學費,換算下來每一堂課大約是400台幣的學費。班上的部份同學會在課堂上睡覺、或者是翹課。我是覺得蠻可惜的,也可能是因為花的不是自己的錢,所以比較無所謂吧。最後3個月下來,我每堂課都有出席。

record

最後學期成績順利過關(70分及格)

成績

到志工會話教室學日文

vulunteer

除了語言學校,我也有到日文教室上課。日本各地有志工的日本語教室(ボランティア日本語教室)可以參加。基本上都是免費,或是付場地費幾百塊日幣,就可以跟日本人會話交流,練習在語言學校學到的內容,也可以交到除了語言學校以外的朋友。我的小組是一位日本老師,跟一位日本女大學生的助教。學生則是有來自澳洲、印度等地的學生。

vulunteer

日本語長沼學校初級班 資訊分享

簡介

位於東京澀谷的日本語長沼學校是東京是最有名的語言學校之一。長沼學校創立於1948年,至今有近70年左右的歷史。

我上的日語綜合課程中的最基礎的課程,也就是從50音開始教起的初級班。班上有些同學是連五十音都不會就來上課。因為老師都有受過專業訓練,所以即使班上同學很多連50音都不會,也都可以進行全日語的授課。老師會透過手勢、表情表達、道具來教學,如果日文完全不會也不用擔心。

這次我是使用了短期滯在的90天簽證入境日本,一共上了三個月的課程。我把一些學校的資訊記錄在這邊,供未來有興趣到長沼學日文的同學參考。

如何報名

  1. 填寫長沼線上的表單
  2. 收到學校承辦人員的回覆之後,會傳送填寫個人資料檔案,再用電子郵件回傳回去。
  3. 學校承辦人員會寄匯款請求書,再拿這個請求書到銀行匯款即可。

基本上要報名長沼的話,可以不用透過代辦,因為長沼校方有懂中文的窗口,如果不會日文的話,可以透過 Email 直接用中文跟校方聯繫。

關於學費

會有課本學費二筆費用,以短期三個月為例:

  1. 初級班課本的費用約8千多日幣

  2. 單一學期三個月的學費約25萬日幣左右,其它課程費可參考官網

tuition

初級教材

長沼的初級課程是採用學校自編的教材「いつでもどこでも話せる日本語(隨時隨地開口說日語」: 課本

其實這本書,台灣大新出版社也有出版,不過跟我在日本上課的版本不一樣,學校在今年七月出了新版的課本。

  1. 課本: 包含上課會使用到會話、文型、單字,另外有提供會話的 MP3 檔案給同學下載
  2. 單字文法書: 依照學生的母語,有英文、繁體中文、簡體中文... 等版本可供選擇
  3. 作業本: 因為每天都有作業,用活頁夾的方式,方便把前一天作業抽出來交給老師批改

入學考試

長沼的班級分成上午班(9:00~12:30)下午班(13:30~17:00),一般是上午班比較熱門,因為下午可以安排其它的事情,像是打工或是出遊等等。長沼在報名的時侯沒辦法保證是上午班或是下午班。上午班跟下午班的名單基本上是按照入學考試後分班順序。所以如果偏好上午班的話,第一天記得要提早到學校。表定是上午9點~11點報到,但是如果想挑上午班或是下午班的話,建議當天8點半前就到學校 …