富足康鞋墊

前幾天拿到這兩款鞋墊,說實在蠻厲害的,把鞋墊換上後確實感覺差蠻多的,經過測量後也拿到最符合我的腳的鞋墊,測量的過程也是相當的仔細,從腳的大小、重心位置、足弓類型、腿型才決定是用哪一種的鞋墊。

半長


材質與邊緣處理部份,正面這材質摸起來是相當的舒服好摸


背面的材質及腳後跟處理


兩種材質接合處


由側面可以很明顯的看到在足弓部份的曲線,這部份也是經由測量結果來決定要用哪一種鞋墊的重點


正反面合照


在背面也有標示上左右腳的,加上腳鞋墊本身的造型應該是不至於會把鞋墊放錯腳



全長


材質與邊緣處理,相同的也可以看到對於足弓、足型的特別設計


側邊看過去


正反面合照,可以看出與半長有些不同,在腳後跟、腳趾後方的那塊有特別處理


腳後跟特寫


腳趾後方特寫


側著的為右腳內側面,此為低足弓款


整體來說就目前這樣穿下來確實感覺很厲害,記得之前看過一個specialized的影片(如下)也是介紹他們配合卡鞋用以矯正踩踏時腳別偏擺,增加效率並且可以保護選手的膝蓋軟骨,雖然我只是個一般人,但因運動造成後遺症這是跟膽固醇一樣,一輩子死心塌地的跟著你不能開玩笑的。


富足康官方網站
鞋墊完整真相

iOS app - Runkeeper

由於本身有騎車行車也喜歡騎著車道處跑,買iPhone之前就一直有在找有沒有相關的app,騎自行車最主要也就是時速(平均、目前、最高)、時間(騎乘時間、總時間)、轉速(踩踏轉速)、心跳(平均、目前、最高)、功率(較高階才有)、GPS軌跡紀錄,不過最最最重要我覺得還是可以給你整合起來的清楚圖表,最早是看到GarminPolar

Garmin Edge 705已經上市有點年紀的產品,不過算是好用,該有的幾乎都有,配合Garmin Trainning Center真的是很棒,免費!而且MAC版本也有,個人就可以從數據來為自己做訓練計畫,就算沒有比賽需求的人也可以藉由這調整自己的體能、健康狀況,後來也相繼推出Forerunner 405Edge 500也都相同有週邊配備(心律帶、轉速sensor等)來得到詳細數據,405為手錶型,若為兩鐵(自行車、慢跑)愛好者更是個不錯的選擇。

Polar在心跳偵測上更是出了名,號稱醫療等級,WEARLINK的sensor更是號稱更不容易受干擾,小弟我由於長期的心律不整但是又愛騎車到處跑,常常會不小心衝太快感到心臟好像快跳出來,由於已經有買了一個簡易的碼表,當時也是個窮學生沒這麼高的預算去買Garmin Edge 705,就先買了Polar F7
(目前似乎已經停產),實際測下來在平路沒啥出力就160,爬坡沒低於170過,一用力最少190,目前最高紀錄是209,真懷疑這到底準不準,我心臟是跳到哪去了,不過Polar在使用上還算是不錯,不過這隻在傳輸檔案上真的很麻煩,他很帥氣的使用聲音傳輸,只要把手錶對到mic上就可以把資訊傳輸到電腦,配合polarpersonaltrainer.com也與Garmin一樣有完整的訓練計畫等資訊可以參考,但是必需要為較高街的機種才有此功能,但是真的很不方便...因為上傳的軟體只有Windows版本,只要傳輸到一個音節沒順利收到就要重傳,Polar ProTrainer 5甚至要到CS 600這種高階產品才開始支援,還需要額外購買軟體,而且只有Windows版本。我相信他的專業,就連環法賽都有合作,並且把選手即時資訊放到網路上給人參考,不管資訊的真假至少他做了。

拉回到正題今天要介紹這款App"Runkeeper pro"過去都為9.99鎂,目前特價免費中(下載前請仔細確認)


速度、消耗卡路里、時間、GPS軌跡紀錄、心跳(需加購套件)都有了,也有一套完整的線上管理規劃的軟體(部份功能需加購),在每次使用完後只要將資訊直接傳輸至網站中就會有免費的這段路程的詳細資訊,如下圖

軌跡直接結合Google Map,由於資料是上傳至官方的server所以就算你換一台iOS Device也可以直接把過去的資訊同步到手機上來,不過他這心律帶的價錢有點高(應該不只一點),Android上面也有這軟體,不過心律帶似乎為不同家(Polar)的,可以參考官方介紹

不過使用這些軟體也是會卡到一些iPhone上常遇上的問題"蓄電"以及在"自行車上固定",這軟體在收到背景後仍然會持續運作,但是就看不到即時地圖與資訊,不然就真的要掛一個尿帶在龍頭附近(EX.上管袋),固定部份雖然市面上有些產品可以順利解決iphone跳車,但是Cycling Computer如果沒辦法防水是很令人頭痛的問題,再戶外你沒辦法保證不會忽然下雨、水噴過來、汗水帥氣的揮灑,市面上雖然有解決方案(如下面這影片),但由於售價昂貴,還是沒辦法輕易下手阿!!


相關連結
Garmin 官方網站
Polar 官方網站
Apple 官方網站
Google Map
RunKeeper 官方網站

Denon AH-260R

外出時帶著耳罩式耳機感覺有點怪怪的,雖然說冬天應該很溫暖,耳掛、耳塞式我都戴不太習慣,最後決定買了耳道的,耳機這個坑要多大有多大,原本有考慮過藍牙耳機,但覺得藍牙耳機還需要另外充電,續行力也是個大問題,聲音品質、訊號干擾、便利使用、價格等因素,最後決定預算有限的狀況下就鎖定在2k以下,條件是"耳道式"、"有線控",最後發現了這款,算是比想像中還好。

耳道式、有線控(Apple原廠晶片)、有夾子、有收納盒、價錢1500有找(幾元...)


耳道式


一樣有附有更換的部份,以及夾子可以把耳機夾在衣服或包包上


線控的部份與apple原廠相同,使用方式也是


線控背後有mic


夾子與線合體


夾子這我覺得很好用,第一在使用線控上得mic講電話,大約夾在領口就可以很清楚的收到,第二就是耳道式耳機是直接掛在耳朵上面(廢話),線有拉扯時會直接拉到耳朵相當不舒服,如果有夾住雖然難以避免,但是可以緩和不少。

收納盒外觀


收納盒內部


有使用收納盒不僅可以避免耳機收起來後亂七八糟又跟其他東西卡成一團,最重要是我有使用耳機孔的塞子,這樣使用耳機時就可以先把耳機孔塞放在裡面避免遺失,不然這小小又黑的東西一掉還真不知道要找多久。

耳機孔塞


整體用起來真的很方便,尤其在講電話的時候真的很棒,一直放在耳邊真的會發熱不舒服,音質雖然不是很優,不過在外還是多忍忍吧...這坑跳下去就爬不出來了,胃口養大很可怕的。

相關連結
Denon AH-260R完整真相

Android Activity重複開啟

Activity在android的角色在我看來就像是iOS的ViewController,可以同時控制很多的東西,在iOS中可以透過push、model等方式直接來做切換,Android中可以靠Intent來做,如果今天單純兩個Activity還很容易,反正A切到B就把自己finish掉就好了,反之亦同,但如果多一點頁面想要掌控這就比較麻煩了,A、B同時都開啟C,那C不就重複開兩次,多佔用了記憶體。Intent所擁有的功能相當的多,不過這篇不是專門介紹Intent就不多提。

Intent intent = new Intent();
intent.setClass(ActivityA.this, ActivityB.class); //要從哪一個Activity切換到另一個
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); //如果這Activity是開啟的就不再重複開啟
startActivity(intent); //開啟指定的Activity
finish(); //結束掉這Activity


相關連結
Android Developers
Android Developers - Activity
Android Developers - Intent

Android Byte Array to Bitmap rotate & resize 圖片旋轉、縮放

最近會用上這也是因為在拍照時需要做些處理,拍完原始檔太大要傳好久光想就很麻煩,最後決定將檔案縮小再傳是比較適當點,剛拍完的照片儲存方式為Byte Array,但作些圖像處理時大多需要轉換為Bitmap比較方便。

Byte Array to Bitmap
buteArrayName就是這byte array的名稱
Bitmap bitmap = BitmapFactory.decodeByteArray(byteArrayName, 0, byteArrayName.length);


Bitmap to Byte Array
其中"bitmap"就是Bitmap的變數名稱,90就是這照片的品質
ByteArrayOutputStream out = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
byte[] array= out.toByteArray();


Rotate
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
//set rotate
int w = bitmap.getWidth();
int h = bitmap.getHeight();

// Setting post rotate to 90
Matrix mtx = new Matrix();
mtx.postRotate(90);

// Rotating Bitmap
Bitmap rotatedBMP = Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, true);
//BitmapDrawable bmd = new BitmapDrawable(rotatedBMP); //如果要在畫面中顯示才需要


resize

Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);

//set rotate
int w = bitmap.getWidth();
int h = bitmap.getHeight();

//set final size
int destWidth = 480;
int destHeigth = 800;

//set scale size
float scaleWidth = ((float) destWidth) / w;
float scaleHeight = ((float) destHeigth) / h;

//set resize
Matrix mtx = new Matrix();
mtx.postScale(scaleWidth, scaleHeight);

// Rotating Bitmap
Bitmap rotatedBMP = Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, true);
//BitmapDrawable bmd = new BitmapDrawable(rotatedBMP); //如果要在畫面中顯示才需要


相關連結
Android Developer
Android Developer - Bitmap
Android Developer - BitmapDrawable
Android Developer - ByteArrayOutputStream
Android Developer - BitmapFactory

Android String字串處理

記得之前寫過一篇"Object C - String",會寫這些很簡單就是因為我大腦記不住,反正知道去哪找就好,超小的腦容量要記住這麼多東西真是有點困難。

這邊就紀錄一下常用的合併、切割、型態轉換、搜尋、替換、找出位置...等

合併
/* 合併 */
String cht = "一二三四五六七八九十";
String num = "1234567890";
String append = cht+num;
System.out.println("append = "+append);
//一二三四五六七八九十1234567890


切割
/* 切割字串 */
String eng = "abcdefghijklmnopqrstuvwxyz";
String[] array = eng.split("k");
for(int i = 0 ; i < array.length ; i ++){ System.out.println("array["+i+"] = "+array[i]); } //array[0] = abcdefghij //array[1] = lmnopqrstuvwxyz


型態轉換
/* 轉換型態 */
String num = "1234567890";
//string轉int
int number = Integer.valueOf(num); //string to int
int aaa = 9999999;
//int轉string
String fromInt = String.valueOf(aaa);
System.out.println("fromInt = "+fromInt+" || number = "+number);
//fromInt = 9999999 || number = 1234567890


搜尋字串(從0開始算)
/* 搜尋字串 */
String eng = "abcdefghijklmnopqrstuvwxyz";
int searchLoc = eng.indexOf("i");
System.out.println("i = "+searchLoc);
//i = 8

searchLoc = eng.indexOf("xy");
System.out.println("xy = "+searchLoc);
//xy = 23

searchLoc = eng.indexOf("isken");
System.out.println("isken = "+searchLoc);
//isken = -1(找不到)


搜尋字元(從0開始算)
/* 搜尋字元 */
String cht = "一二三四五六七八九十";
String num = "1234567890";
char c = cht.charAt(2);
System.out.println("cht third char = "+c);
//cht third char = 三

c = eng.charAt(1);
System.out.println("eng second char = "+c);
//eng second char = b


取得字串指定位置(從0開始算)
/* 取得字串指定位置 */
String num = "1234567890";
String subTest = num.substring(1, 4);
System.out.println("subTest = "+subTest);
//subTest = 234


字串長度
/* 字串長度 */
System.out.println("cht length = "+cht.length());
//cht length = 10


替換字串
/* 替換字串 */
//替換全部
String replaceTest = "abcabcabc";
String replaced = replaceTest.replaceAll("abc", "123");
System.out.println("replaceAll = "+replaced);
//replaceAll = 123123123

//替換最先找到那個
replaced = replaceTest.replaceFirst("abc", "123");
System.out.println("replaceFirst = "+replaced);
//replaceFirst = 123abcabc


格式化字串
/* 格式化字串 */
String formatTest = "%02d";//定義為兩位不足兩位則補"0"
for(int i = 5; i < 15; i++){ System.out.println("format = "+String.format(formatTest, i)); } //format = 05 //format = 06 //... //format = 13 //format = 14


清除空白字串(清除前後所有的空白,但是字串與字串間空格不會被清除)
/* 清除字串空格 */
String trimTest1 = "abc ";
String trimTest2 = " abc";
String trimTest3 = " abc ";
String trimTest4 = "abc abc";
String trimTest5 = " d abc";
System.out.println("trimTest1 = "+trimTest1.trim());
System.out.println("trimTest2 = "+trimTest2.trim());
System.out.println("trimTest3 = "+trimTest3.trim());
System.out.println("trimTest4 = "+trimTest4.trim());
System.out.println("trimTest5 = "+trimTest5.trim());
//trimTest1 = abc
//trimTest2 = abc
//trimTest3 = abc
//trimTest4 = abc abc
//trimTest5 = d abc


字串比對
/* 字串比對 */
String cht = "一二三四五六七八九十";
String num = "1234567890";
String equalcht = "一二三四五六七八九十";
System.out.println("cht & equalcht = "+cht.equals(equalcht)+" || cht & eng = "+cht.equals(eng));
//print cht & equalcht = true || cht & eng = false


字串轉字元
/* 字串轉字元 */
String cht = "一二三四五六七八九十";
char c = cht.toCharArray()";
for(int i = 0; i < c.length; i++){ System.out.print("["+i+"] = "+c[i]); }


相關連結
Android Developer
Object C - String

Android soft keyboard keyCode 66 called twice軟體鍵盤重複送出ENTER

前幾篇有介紹到EditText要怎樣來偵測所按下的按鈕"Android EditText Listening soft keyboard"確實可以很正常的運作,那篇內也有寫到如何偵測硬體鍵盤,但就在今天發現了這新問題,在Input的時候所有按鍵都是正常的,但在按下"ENTER"(中文環境下為"完成")居然會重複送出兩次,如果這按鈕沒作啥特別事情還好,但如果是需要送request給server就頭大了,把log印出來看了一下發現重複被執行了兩次,一次是按下,一次是放開,相對於Flash內就是Press&Release,iOS內就是TouchDownInside&TouchUpInside,而Android內則是ACTION_DOWN&ACTION_UP。

用法其實沒啥兩樣,就再多加上一個判斷就好
EditText.setOnKeyListener(new OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
System.out.println("keyCode = "+keyCode+" || event = "+event);

if(event.getAction()==KeyEvent.ACTION_DOWN){
//按下
return true;

}else{
return true;
//放開
}

//return true = finish || false = track
return false;
}
});


相關連結
Android EditText Listening soft keyboard

SANYO eneloop KBC-L2BS & D1AS

自從買了iphone4後常常會覺得電量有點不夠,3g反正有吃到飽,只要在沒wifi的地方幾乎都是直接打開,剛開始推播也都是一直給他開著,但發現這耗電量太可怕了,一下子電量就燒光光,最後就開始找行動電源的東西,發現到智慧型手機在網路連線時取得回應會造成不小得耗電,一直瀏覽網頁、看影片、3dGame一下子電就燒光光,由於行動電源的造型大多為方形,接著一條線至手機,也因此有人開始稱呼為"尿帶"。

就以iphone來說外接電源主要可分為三種類型
1.背蓋、外殼型
優點:一體
缺點:整體重量變重、價格高

2.直接連接dock(30pin)
優點:不用再接傳輸線,需要時再拿出來充
缺點:容量大多不大
例如很有名的The Icon

3.透過另外的線來連接dock(30pin)
優點:容量大
缺點:需要另外準備傳輸線

最後還是決定買第3種,傳輸線平常也可以跟電腦接著用,買了一條伸縮線也有效的解決線很雜亂的問題,原本是購買了D1AS(如下圖),可以使用兩顆AA(三號)來給iphone充電,但這只能讓電池放電無法給電池充電,查了一下兩顆滿電的eneloop電池大約可以回充50~70%,由於充電電池本來就有不少,這個重量也很輕是個不錯的選擇,但購買後不斷出現問題,充電時必須要在某個角度才可以正常充電,稍微移動到就會造成充電充斷並且不再繼續充電,測試了很久發現問題沒辦法解決,問了賣家給我的答覆是"這只能使用原廠線才可以正常使用",關於這點是蠻有疑惑的,我換了三條原廠充電線+一條伸縮線都沒辦法正常使用,賣家居然還說我賣這麼多就你有問題,由於無法正常使用就把他退了,不然買個裝飾品來也不知道有啥用。


最後看到了eneloop的另一款L2BS(如下圖),5000mAh的容量,雙USB 1A輸出,由於ipad充電必需要有1A才可以正常充電,所以L2BS(如下圖)的前一代L2AS是沒辦法正常給予ipad充電,詳細內容可以參考官方的表L2BS(如下圖)的大約可以供給iphone4兩次的電量,對我來說應該是超級夠了。


相關連結
SANYO 官方網站
eneloop D1AS
eneloop L2BS
D1AS完整真相
L2SB完整真相