2014年10月27日 星期一

在SQl Serverl 中模擬Split方式切割字串

有時候在DB欄位中會將資料以連結符號例如逗號串接成字串,如果我們希望將這類型的資料再取出成為其他子查詢的條件,可以先透過function將字串處理為table使用,function範例如下:

' 輸 入 值 : @String : 使用逗號或某種截斷符號的字串。
'     @Delimiter : 截斷符號。(通常為逗號)
'
' 回 傳 值 : 分割資料完成的資料表,欄位名稱為[SerialNo]。
'
CREATE FUNCTION BASE.fnSplit(@String nvarchar(max), @Delimiter char(1))
returns @temptable TABLE (SerialNo nvarchar(max))       
as       
begin       
    declare @idx int       
    declare @slice nvarchar(max)
      
    select @idx = 1       
        if len(@String)<1 or @String is null  return       
      
    while @idx!= 0       
    begin       
        set @idx = charindex(@Delimiter,@String)       
        if @idx!=0       
            set @slice = left(@String,@idx - 1)       
        else       
            set @slice = @String       
          
        if(len(@slice)>0)  
            insert into @temptable(SerialNo) values(@slice)       
  
        set @String = right(@String,len(@String) - @idx)       
        if len(@String) = 0 break       
    end   
return       
end  
GO
建立function後,就可以在SELECT語法中直接使用(注意[SchemaName]如果沒有指定Schema就不需要)
SELECT [SerialNo] from [SchemaName].fnSplit('1,2,3,4,5',',')
結果如下圖:

2014年10月26日 星期日

MOPCON 2014 一連參加兩天下來的心得

主要在探討哪些議題:
行動開發技術,行動服務營運。

講師都是誰:
Microsoft,ASUS cloud,IBM,Yahoo,KKBox,Amazon,Mozilla等科技公司。 講者皆是開發者,從創新技術,商業,營運等角度剖析最新行動應用趨勢。

關鍵字:
iOS, Android, Windows phone app等應用開發經驗、Python、Ruby on Rail、app市場、數位內容、Bigdata、O2O、中國市場經驗、雲端開發平台(Amazon Web Service, ASUS EZoApp, IBM Bluemix, Microsoft Asure)、Machine Learning

2014年10月25日 星期六

MOPCON 2014 - 濁水溪以南最強大行動應用科技開發者年會

第三屆 MOPCON今年在高雄國際會議中心舉辦,10/25~10/26為期兩天,這邊對hackpad中其他與會者的心得做整理,以我有參與的議程為主。

查看所有 Day 1 hackpad 
10/25 Day 1:

ASUS Cloud & the API enabled solutions
講者:吳漢章(Peter Wu)

API 是整合物聯網、大數據,雲端和社群等軟硬體整合驅動的關鍵,未來世界改變重要的大的現象,應用這件事情在我還是學生的時候跟未來二十年很大的差異就是scale,我們不會再看十個或一百個device的應用,我們是看一億個,十億個。做到很大的資料量,最好還可以對資料做加值。

在這樣的應用趨勢裡面,很關鍵的地方就是API,好的API才能把資源分享出去。是華碩的核心。

我們會introduce一些具國際標準的API,叫做xAPI,把教學跟學習有關的活動記錄起來。以基本的三個物件組成,記錄發生的過程,以利學習行為。在教育領域裡面就可以做到長時間分析學生的學習能力,學習內容的推薦,這些都是華碩最近這幾年努力promo的部分。

國外現在開始有一個觀念就是API comm,有人生API,有人用API。用的人也會生API,跟別人互通。API是未來Cloud的貨幣


三廳:面對贏者全拿的APP市場開發者該怎麼成功 - 以 APP 手機遊戲市場為例
講者:徐德航

隨著智慧手機大行其道,App市場猶如火山噴發一般的快速成長。這個App市場是贏者全拿敗者一無所有,在這個競爭異常激烈的市場開發商該如何成功?從App市場中最賺錢丶最激烈的手機遊戲市場分析應該能給各位一些啟發。

***App市場概況***
手機遊戲是 App 市場主流
主要獲利來源,台灣市場排 top 10 (2013 iOS), top15(iPad)
在 Google Play 市場規模第五名
大部分的報告裡都表示在APP的營收中大概80%都是遊戲類,App 市場是一個贏者全拿的市場 (2% 的人 拿 54% 收入,弱肉強食的市場)

***開發人數、開發者職業、遊戲數量與營收關係***
6~9人開發團隊營收為單人的112倍
團隊製作過十款以上遊戲營收是剛入行的 31 倍
不是資源多就會贏

APP遊戲生命週期短暫
手機遊戲市場對小公司越來越不利
大環境因素:
手機遊戲崛起,遊戲通路被國外蘋果、谷歌等巨獸把持
手機遊戲市場競爭激烈,每年上萬款免費遊戲競爭
手機遊戲推廣費用逐年提高

台灣APP遊戲開發內在因素
- 台灣政府不鼓勵不保護
- 傳統的遊戲公司仍在傳統
- 台灣投資市場冷清
- 獨立開發者集中在單機遊戲,收入越來越小

***遊戲開發與成功***
成功遊戲必備要素
創意
多款經驗,開發越多,活得越久越強
適切美術表現
懂得分工合作
對消費者ㄧ有深刻的理解
穩定的Programing團隊
美術人要很多
知道自己在世界中的位置
舉例:今天如果騰訊跟你說,我們1:9你要不要?

爆紅不等於賺錢,會做遊戲不一定適合當老闆
法律問題-合約怎麼寫

開發經驗與成功的關聯性 - 做越多款成功機率越高


三廳Building Mobile Apps on AWS
講者:James Tien


AWS makes development of  cross-platform mobile applications easy. With highly-scalable cloud  services, mobile developers can build powerful cloud-backed mobile apps  with just a few lines of code. In this session, you will learn how to  connect directly to these services and how to build a powerful back end  for your Android and iOS applications. We will also share some best  practices from other successful apps such as Flipboard and Supercell so  you can focus on differentiating your app functionality whilst leaving  the 'table stakes' with no differentiated value to the cloud.

AWS Remove Waste
70%的時間專注在商業目標,30%的時間管理伺服器。

IT 專案失敗
31 % 沒完成
52 % 完成的專案overburn budget
失敗原因
資源掌握不精準
changing requirements
unmanaged risks assumption 
increasing complexity

On the Cloud
在有需要的時候取得資源
在不需要的時候 release 資源
用什麼付什麼

如果你可以很大量的失敗,就可以找到你成功的關鍵

AWS Mobile Services -> http://aws.amazon.com/mobile/
Amazon Cognito -> user identity and data synchronization service
降低進入/使用門檻的重要性
掌握匿名潛水的使用者行為:Unauthenticated Identities
把原本在潛水的使用者,利用Facebook login 之後,可以把兩個做連結
offline 的behavior也可以catch,待online後記錄_
Amazon Mobile Analytics
只要把SDK(android /iOS)放至程式即可catch information
客戶可以own your data且即時知道使用者狀況(refresh/1 hr)
可以customize event,偵測自己要偵測的資訊
Amazon SNS Mobile Push 
傳統推播要考慮iOS,Android,WP,中國透過百度...等等,AWS解決了所有跨平台問題
無限量scale
Amazon Kinesis Connector for Mobile Apps -> http://aws.amazon.com/kinesis/?nc2=h_ls
Amazon Simple Storage Service (S3)


 二廳:講個秘訣之:離開新手村後也可以順便聽一下的程式「設計」指南
講者:Joe

圖書館、書店、網路上有很多探討程式設計的資源可以取得,但是由於考試不會 考,所以最後每年還是有不少擅長撰寫 Bug 的同學畢業且投入職場。  本演講將由現實世界中「設計心理學」的觀點切入,邀請路過的朋友重新看待程式「設計」這一回事,期待能透過簡單的反思提升「設計」的水準,並且開闊視野 -  試著去瞭解使用者在想什麼。 # 參考書目:The Design of Everyday Things (<= 千真萬確,設計人在看的書)  # 聽眾群:建議有兩年以上程式設計經驗

講者投影片
http://sssslide.com/www.slideshare.net/excusemejoe/programming-x-design-mopcon-2014

講者推荐書藉:
唐納 諾曼 設計心理學
Clean code
設計的設計


 二廳:Rational, Emotional, and Meaningful Design
講者:Peter Tseng

Yahoo致力於讓全球網友的每日造訪都充滿驚喜和愉悅。透過各種行動裝 置,我們提供深入且完整的個人數位內容使用經驗,讓全球網友隨時與其最相關的人事物連結在一起。同時,Yahoo有效連結廣告主與消費者關係,以創造絕佳 廣告價值。

REM
Designing and innovating on Rational, Emotional, Meaningful value. 

Rational 理性
Emotional 感性
Meaningful 有價值的

通常在deisgn thinking的第一步就是教我們如何開始解決問題,yahoo如何做出個更有去的product 。每天在手機上使用的服務有哪些?可能是拍照,影片,可能是social,每天我們有越來越多時間花在這些上面

有三個重點可以給你們帶回去:
第一:Don't Listen to Users: Sample Their Experience."
這好像是違背了使用者經驗,
Ford:"if I had asked people what they wanted, they would have said a faster horse."
使用者不能給你答案。
Steve Jobs做iPhone跟iPad的時候完全沒有問使用者要做些什麼,如果你今天要創新的話要觀察使用者為什麼會有這樣子的需求,要去觀察而不是要去要聽。
Empahty Deisgn:Listen and Understeand, Watch and Ovserve
你要去觀察,你要去看,如果每個星期有prototype的話,就要找到五個使用者去試用。如果能夠做到的話,就可以做出像是Yahoo超級商城這樣的App。

第二點:不要怕失敗
Michael Jordan: "I can accept failure, everyone fails at something. But I can't accept not trying"
剛剛各位看過我們很多超級商城不同版本的設計,我們一直嘗試讓大家找出最好的。
我們現在使用card的設計
我們會讓全公司會先試用這個產品,會先把prototype做出來,然後我們做了一個影片。我們想了很多怎麼樣用手機跟使用者互動,但是時間有限也沒有坐在prototype裡面,但是這些點子我們都有保留,我們一定要對自己的產品有熱心。最近有很多科技公司開始去create lab讓他們去做創新的。
如果你對這個idea有興趣的話,你就把它做出來,MS在北京也設立一個lab, Microsoft garage,讓很多enginner跟designer去做很多創新的project。

在設計上的Rational是快速的,讓使用者不會有感覺不一致,Emotional讓感覺很好玩,Mearingful使用者能獲得什麼。


 一廳:Hack & Go !
講者:Ben Lue


隨著應用軟體走上雲端,在雲端開發程式也將成為事實。 目前的 API/BaaS 服務讓我們初窺未來的可能性,但真正讓開發者瘋狂的 API  服務才正要上場。

API is...
不是Cloud Storage
不是Real-Time Sync
不是API Portal
也不是Function code

API通常是透過網路而發生的,如果中間斷線怎麼辦?顯然會有問題。可能必須把很多function call包在一起,一起執行。
格式要有一致性,可理解性(知道要做什麼事情),程式性(目前的API定義都還沒有提到這一點)
包裹式的功能,全有全無的執行結果(理論上不用你寫太多的程式,要有開箱即用的功能)
完整的安全機制

三廳:台灣與海外網路創業之差異與經驗談
講者:謝耀輝 (John Sie)

分別從產品、技術到營運等方面兩岸有和差異? 互聯網~物聯網~車聯網~移動互連網~哪來那麼多網? 早創業好還是晚創業好?還是根本別創業?! 聊聊O2O、穿戴裝置、大數據、行動支付等技術或應用... 






2014年10月21日 星期二

已成為傳說的parseInt('08')

 曾經有個client的功能需要將user的閱讀秒數記錄下來回存到DB中,但奇怪的是QA總是發出BUG,描述是累積秒數有時正確有時不正確原因不明。

 經過仔細的trace才發現原來parseInt這個方法其第二個參數(radix)是用來定義進位方式規則。才明白parseInt預設是8進位,所以當有字串例如:

parseInt('08') 便會轉換為0

需要寫成 parseInt('08',10) 結果才會是8。

 但這個問題在較新的browser已經不會再出現了,在ECMAScript 5之後parserInt預設值已改為10進位了。

2014年6月5日 星期四

CSS Font-Size比較: em,px,pt,percent

一般而言,1em = 12pt = 16px = 100%

使用 px 的時候,在使用 IE 瀏覽器時,是無法自行調整文字大小的;而em的值並不是固定的
,em會繼承父級元素的字體大小。

下圖說明了當使用 em 或 % 時,當畫面放大時字體也會跟著放大,pt與px則不會。
Font-sizes as they increase from 100% to 120%.

參考資料:
CSS Font-Size: em vs. px vs. pt vs. percent
CSS 使用 px 和 em 的差異

2014年5月1日 星期四

jQuery.grep() 用法與使用情境

jQuery.grep()

描述:grep可以在陣列中逐一尋找並篩選出符合條件的內容,該方法會返回一個新的陣列。

用法

  • jQuery.grep( array, function(elementOfArray, indexInArray) [, invert ] )

範例
var arr = [ 1, 9, 4, 7, 3, 8, 6, 9, 1 ];

//找出數值不等於9的資料
arr = jQuery.grep(arr, function( a ) {
  return a !== 9;
});
結果: 1, 4, 7, 3, 8, 6, 1


使用情境:很多時候我們會需要在資料物件的集合(array)中根據某些條件去尋找或篩選出資料,所以除了上面簡單的型態的方法,grep還能夠處理更複雜的型態,例如自己定義的object,範例如下:

2014年2月10日 星期一

jQuery.data() 用法與使用情境

jQuery.data()

描述:對一個特定的DOM元素附加任何類型的資料(字串,陣列或物件皆可),或對特定元素取得已設定過jQuery.data()的資料

用法
  • jQuery.data( element, key, value )
  • jQuery.data( element, key )

範例:設定兩個按鈕,按下第一個按鈕時為它設上jQuery.data(),key為"count" value為"10",當按下第二個按鈕時,alert第一個按鈕所設定之data("count")。

HTML
<button id="btn1">set data</button>
<button id="btn2">get data</button>
JavaScript
$("#btn1").click(function(){
    $(this).data("count","10");
});

$("#btn2").click(function(){
    alert($("#btn1").data("count"));
});
執行結果(可以點選Edit in JSFiddle實際測試)

使用情境:有些時候我們會需要在某個DOM元素上附加額外的非原生屬性,通常是用來給程式做為判斷或識別的資料,以前的做法就是直接在HTML tag中給定一個屬性與資料如下
<input type="hidden" name="hiddenInput" count="10">

 但是這樣的做法會讓資料曝露在原始碼中,當有某些重要資料(例如:隱私資料、或是在執行某些功能時會需要暫存、又或是要更新到DB的資料)需要隱藏時時,這樣的做法就非常不安全;而若是使用jQuery.data()便不用擔心這些問題,jQuery的cache機制會處理DOM元素與資料的匹配,此外也可以免除在HTML tag中定義一堆屬性。


延伸閱讀:
jQuery API Documentation
jQuery.data cache原理