tag:blogger.com,1999:blog-3795270036503426632024-03-13T11:19:57.988+08:00ola的家關於ola所學的地理資訊系統、程式開發及心情.....ola的家http://www.blogger.com/profile/17489699564369049796noreply@blogger.comBlogger382125tag:blogger.com,1999:blog-379527003650342663.post-69998561456869209262014-05-29T10:52:00.002+08:002014-05-29T11:03:22.600+08:00ola的家http://www.blogger.com/profile/17489699564369049796noreply@blogger.com0tag:blogger.com,1999:blog-379527003650342663.post-37649186577503856492014-03-31T21:56:00.001+08:002014-03-31T21:56:04.123+08:00DEM Put Z Value紀念延續假日的氣勢,阿斯~~~~~~~~~! 齁齁齁!
<br/>
<br/>
<div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/-dVpDi5LdVpQ/UzlzqIXBzHI/AAAAAAAAJ_Y/GpEiJFyctoI/s1600/DTMPut.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-dVpDi5LdVpQ/UzlzqIXBzHI/AAAAAAAAJ_Y/GpEiJFyctoI/s640/DTMPut.png" /></a></div>ola的家http://www.blogger.com/profile/17489699564369049796noreply@blogger.com0tag:blogger.com,1999:blog-379527003650342663.post-65365452475593558432014-03-29T22:15:00.001+08:002014-03-29T22:15:35.734+08:00DEM Get Z Value紀念很久沒有在家裡寫程式了,今天放著PS3、暗黑3不玩,只因為這個題目太有趣,僅以本篇文章感謝今日成果的大功成:瑋哥,你實在是我見過最無私、有實力、夠龜毛的硬底子工程師!!
<br/>
<br/>
<div class="separator" style="clear: both; text-align: center;"><a href="http://1.bp.blogspot.com/-2grdRb3VYYM/UzbUhvRRaqI/AAAAAAAAJ_I/FdQcWirkjQs/s1600/DTM_%E3%84%8E%E3%84%8E.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-2grdRb3VYYM/UzbUhvRRaqI/AAAAAAAAJ_I/FdQcWirkjQs/s400/DTM_%E3%84%8E%E3%84%8E.png" /></a></div>ola的家http://www.blogger.com/profile/17489699564369049796noreply@blogger.com0tag:blogger.com,1999:blog-379527003650342663.post-76837651496064838722014-02-19T18:09:00.000+08:002014-02-19T18:10:20.132+08:00js小抄_動態的變數名稱[使用eval()方法]有時候會有一個需求,想在某種情況代入變數Value_A,某些時候代入變數Value_B,那可能會寫:<br />
<code>
var output = '';
if (status=='A'){
output = Value_A
}
if else(status=='B'){
output = Value_B
}
alert(output);
</code>
<br />
但若是情況有100種,豈不是要寫100個判斷式處理;這時,可以使用eval()方法來處理:<br />
<code>
var output = eval('Value_' + status);
alert(output);
</code>
<br />
上述方式,將可在status為A時,取到Value_A的值,status為GG時,取到Value_GG的值,大大使程式碼更加靈活。
<br />
<br />
eval()也就是將函式內的內容組合完成後,以JavaScript執行,所以能夠產生許多巧妙的變化,常被舉的例子是:
<br />
<code>
var n=2;
var b=3,c=4;
eval('a'+n+'=b*c');
</code>
<br />
上式會得出a2變數為12。
ola的家http://www.blogger.com/profile/17489699564369049796noreply@blogger.com0tag:blogger.com,1999:blog-379527003650342663.post-72693978841959886212014-02-14T19:45:00.002+08:002014-02-14T19:46:36.028+08:00jQuery_動態載入js與html最近為了重拾JavaScript,灌了VS2013,被強制升級為IE11,才知道原來IE11執行js的效能不錯,錯誤"似乎"也變少許多,但我想絕大部分的使用者短期內都不可能升級吧! :D<br />
<br />
<br />
JavaScript實在是太不熟悉,也不知道用什麼架構可以建置一個稍具規模的專案,在看不太懂網路上各大大的模組化後,決定亂建一個方式,總是有一個起頭,先記錄一下關鍵。<br />
<br />
1. 使用jQuery動態載入HTML(<a href="https://api.jquery.com/load/" target="_blank">官網</a>)<br />
<code>
$("#div1").load("widgets/function/functionPage1.html", function () {
console.log("Load functionPage1.html OK.");
});
</code>
使用jQuery可以相當簡便的將functionPage1.html插入名為div1的容器中,達到頁面分離效果。
<br />
<br />
<br />
2. 使用jQuery動態載入js(<a href="https://api.jquery.com/jQuery.getScript/" target="_blank">官網</a>)<br />
<code>
$.getScript("function/jfunction1.js", function (data, textStatus, jqxhr) {
console.log(data); // Data returned
console.log(textStatus); // Success
console.log(jqxhr.status); // 200
console.log("Load jfunction1 was performed.");
});
</code>
利用getScript方法,將jfunction1.js動態讀取到頁面中,當完成時會觸發後面的function,可以做為init之用。
<br />
<br />
<br />
有了這兩個方法,接著就是試圖把html與js分門別類的抽出,再於適當的時機讀取(要使用前),看到主頁清爽的感覺就是爽! :Dola的家http://www.blogger.com/profile/17489699564369049796noreply@blogger.com0tag:blogger.com,1999:blog-379527003650342663.post-30326399075661413242013-12-22T08:10:00.001+08:002013-12-22T08:10:45.294+08:00Olaccount如何進行備份及還原<div style="font-family: arial; font-size: small;">
<div>
<span style="color: white;">備份步驟如下:</span></div>
<div>
<span style="color: white;"><br /></span></div>
<div>
<span style="color: white;">1. 選擇自動備份功能,第一次使用軟體詢問時打勾;或於設定中將自動備份功能開啟。</span></div>
<div>
<span style="color: white;"><br /></span></div>
<div>
<span style="color: white;">2. 手動備份:利用匯出/匯入功能,選擇'匯出CSV檔案'功能。</span></div>
<div>
<span style="color: white;"><br /></span></div>
<div>
<span style="color: white;">*. 以上功能皆會將備份檔案儲存於SDCard的OLAccount資料夾(於根目錄內)。</span></div>
<div>
<span style="color: white;"><br /></span></div>
<div>
<span style="color: white;">--------------------------------------------------------------------</span></div>
<div>
<span style="color: white;"><br /></span></div>
<div>
<span style="color: white;">還原步驟如下:</span></div>
<div>
<span style="color: white;"><br /></span></div>
<div>
<span style="color: white;">1. 將備份資料存出,位置在SDCard的OLAccount資料夾(於根目錄內)。</span></div>
<div>
<span style="color: white;"><br /></span></div>
<div>
<span style="color: white;">2. 若存出後有用EXCEL進行編修過,請先以附屬應用程式的記事本另存新檔為UTF-8格式(於存檔鈕的左方編碼下拉式選單選擇)。</span></div>
<div>
<span style="color: white;"><br /></span></div>
<div>
<span style="color: white;">3. 將該檔案儲存到新手機SDCard的OLAccount資料夾(於根目錄內)。(若沒有資料夾,可以自己建一個,或是先使用帳本的自動備份或手動備份,帳本會自動建立)</span></div>
<div>
<span style="color: white;"><br /></span></div>
<div>
<span style="color: white;">4. 進入OLAccount程式,選擇匯出/匯入功能,點選"選擇檔案",選擇剛剛放進資料夾的檔案。</span></div>
<div>
<span style="color: white;"><br /></span></div>
<div>
<span style="color: white;">5. 點擊"匯入CSV檔"功能。</span></div>
<div>
<span style="color: white;"><br /></span></div>
<div>
<span style="color: white;">---------------------------------------------------------------------</span></div>
<div>
<span style="color: white;">**. 備分功能儲存在SDCard中,若是SDCard損壞則無法還原,可自行將備份檔案寄送至Mail。</span></div>
</div>
<div style="font-family: arial; font-size: small;">
<span style="color: white;"><br /></span></div>
<div style="font-family: arial; font-size: small;">
<span style="color: white;">功能位置:</span></div>
<div style="font-family: arial; font-size: small;">
<span style="color: white;">選擇匯出/匯入功能,先設定常用Mail;再利用寄送e-Mail送至自己的信箱。</span></div>
ola的家http://www.blogger.com/profile/17489699564369049796noreply@blogger.com0tag:blogger.com,1999:blog-379527003650342663.post-35616757941679868732013-10-31T15:05:00.002+08:002013-10-31T15:05:44.913+08:00iOS小抄_讓CLLocationManager持續在背景執行到TARGETS的Info中,於Custom iOS Target Properties加入:<br />
<br />
Required background modes,並在子項中加入App registers for location updates。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-sY1tIlU4ykI/UnIBNMbZ4FI/AAAAAAAAIbY/8n_62aOo8UU/s1600/CLLocationManager%E6%8C%81%E7%BA%8C%E5%9C%A8%E8%83%8C%E6%99%AF%E5%9F%B7%E8%A1%8C.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-sY1tIlU4ykI/UnIBNMbZ4FI/AAAAAAAAIbY/8n_62aOo8UU/s1600/CLLocationManager%E6%8C%81%E7%BA%8C%E5%9C%A8%E8%83%8C%E6%99%AF%E5%9F%B7%E8%A1%8C.png" height="56" width="640" /></a></div>
<br />ola的家http://www.blogger.com/profile/17489699564369049796noreply@blogger.com1tag:blogger.com,1999:blog-379527003650342663.post-84167942718591728102013-09-30T17:31:00.000+08:002013-09-30T17:31:44.213+08:00給他魚吃,不如教他釣魚。自己喜歡學釣魚、教釣魚,不代表大家都喜歡,<br/>
<br/>
無謂的堅持放在自己與一起有堅持的人身上,<br/>
<br/>
每件人事物都在不經意的情況下企圖教你些「事情」,<br/>
<br/>
:D
ola的家http://www.blogger.com/profile/17489699564369049796noreply@blogger.com0tag:blogger.com,1999:blog-379527003650342663.post-32406482256547891272013-06-21T14:15:00.001+08:002013-06-21T14:15:37.456+08:00SQL Spatial小抄_查詢geometry欄位為wkt字串久沒寫一下就忘記了,小抄一下。<br/>
<br/>
<code>
SELECT [OBJECTID],[Name],[Shape].STAsText() as WKT FROM table
</code>
<br/>
<br/>
Binary格式:<br/>
SELECT SHAPE.STAsBinary() as WKB FROM suburbs WHERE SHAPE IS NOT NULLola的家http://www.blogger.com/profile/17489699564369049796noreply@blogger.com0tag:blogger.com,1999:blog-379527003650342663.post-54904374841794815832013-05-15T11:52:00.001+08:002013-05-15T11:52:19.621+08:00ArcGIS Server Flex Viewer的事件傳遞(AppEvent)一般在Flex裡面進行事件傳遞,都是以dispatchEvent來進行傳遞,例如:<br/>
<code>
dispatchEvent(new Event(LOCATE_RESULT_CLICK, true));
</code>
<br/>
但在ArcGIS Server Flex Viewer內註冊了自己的事件傳遞,也就是利用AppEvent這一個as來進行操作,<br/>
所以當我們看到某個widget內以AppEvent.addListener的方式註冊事件,<br/>
在別的widget想要呼叫時,就必須使用AppEvent來進行呼叫。<br/>
<br/>
<br/>
方式:<br/>
<code>
AppEvent.dispatch(AppEvent.REFRESH_LEGEND);
</code>ola的家http://www.blogger.com/profile/17489699564369049796noreply@blogger.com0tag:blogger.com,1999:blog-379527003650342663.post-17742018190971180682013-05-15T11:41:00.003+08:002013-05-15T11:41:47.525+08:00iOS小抄_設定可利用iTunes管理document資料夾沒作筆記,一下子又要忘記了,趕快寫一下。<br/>
<br/>
步驟:<br/>
於plist右鍵,點擊Add Row,增加Application supports iTunes file sharing項目,並將屬性設為YES。<br/>
<br/>
就可以將iPad接上電腦後,以iTunes直接拉檔案到該App的document資料夾。ola的家http://www.blogger.com/profile/17489699564369049796noreply@blogger.com0tag:blogger.com,1999:blog-379527003650342663.post-48276002044966943372013-04-11T09:38:00.001+08:002013-04-11T09:41:24.781+08:00iOS學習_UILabel配合字數調整高度(使用sizeWithFont)有很多時候我們在呈現簡介,備註或說明等欄位時,會遇到文字過長UILabel無法一次顯示的狀況,最好的辦法莫過於從資料庫撈出的字數與想要顯示的字體大小來計算出UILabel應該有的寬高,而在iOS的字串內有一個很讚的方法:sizeWithFont。
<br/>
<code>
CGSize stringSize = [datastring sizeWithFont:[UIFont systemFontOfSize:17]
constrainedToSize:CGSizeMake(canputwidth,CGFLOAT_MAX)
lineBreakMode:NSLineBreakByWordWrapping];
</code>
<br/>
說明:計算datastring在17字體大小下,擺在canputwidth的寬度中,並且以文字換行的方式計算CGSize。
<br/>
<br/>
獲得CGSize後即可由stringSize.width與stringSize.height取得需要的寬高,在利用setFrame來重新給定UILabel的高度。
<br/>
<br/>
程式碼:
<br/>
<code>
-(void)someMethod:(NSString*)name
{
int fontsize = 17;
CGSize labSize = [self calwordH:name canputwidth:self.view.bounds.size.width];
UILabel *fieldlb = [[UILabel alloc] init];
fieldlb.font = [UIFont systemFontOfSize:fontsize];
fieldlb.backgroundColor = color;
fieldlb.text = name;
[fieldlb setNumberOfLines:0];
fieldlb.lineBreakMode = NSLineBreakByWordWrapping;
[fieldlb setFrame:CGRectMake(0.0f,0.0f,labSize.width,labSize.height)];
[self.view addSubview:fieldlb];
}
-(CGSize) calwordH:(NSString *)string canputwidth:(int)canputwidth
{
CGSize s = [string sizeWithFont:[UIFont systemFontOfSize:17]
constrainedToSize:CGSizeMake(canputwidth,CGFLOAT_MAX)
lineBreakMode:NSLineBreakByWordWrapping];
return s;
}
</code>
<br/>
<br/>
iOS6以後NSLineBreakByWordWrapping改為NSLineBreakByWordWrapping。
ola的家http://www.blogger.com/profile/17489699564369049796noreply@blogger.com0tag:blogger.com,1999:blog-379527003650342663.post-15019020243619207872013-03-21T14:15:00.001+08:002013-03-21T14:17:12.962+08:00iOS學習_使用企業帳號發布<br />
很謎的企業用帳號,很有趣的帳號管理,:D<br />
<br />
------------------------------------------------<br />
<br />
開發使用:<br />
<br />
1. 在Mac,開啓鑰匙圈,確認偏好設定內的,憑證,線上憑證狀態協定(OCSP與CRL為停用)<br />
<br />
2. 選擇選單鑰匙圈存取>憑證輔助程式>由憑證授權要求憑證,匯出憑證授權。(EX:CertificateSigningRequest_enterprise_ola.certSigningRequest)<br />
<br />
3. 電子郵件填寫已經加入企用帳號的Apple ID,取名稱(enterprise_ola),並選擇儲存到磁碟,勾選指定密鑰配對資訊。<br />
<br />
4. 選擇密鑰大小2048與RSA演算法。<br />
<br />
5. 進到 https://developer.apple.com<br />
<br />
6. 點擊iOS Dev Center<br />
<br />
7. login步驟三的Apple ID<br />
<br />
8. 登入後,點擊右側iOS Provisioning<br />
<br />
9. 選擇左側選單Certificates,於Development上傳剛剛建立的檔案(CertificateSigningRequest_enterprise_ola.certSigningRequest)<br />
<br />
10. 重新整理網頁以後,可以下載XXX.cer檔案,雙擊兩下存入鑰匙圈。<br />
<br />
11. 回到網站,選擇左側選單的Provisioning。<br />
<br />
12. 點擊New Profile,建立一個新的Provision,AppID在開發階段可以先用:Xcode iOS Wildcard App ID<br />
<br />
13. 下載後雙擊兩下進到Xcode Organizer的Provisioning Profiles。<br />
<br />
14. 至project/Build Settings/Code Signing Identity,更改Debug使用的憑證,測試是否可以正常由Xcode灌到測試機當中。<br />
<br />
------------------------------------------<br />
發佈使用:<br />
<br />
1. 至網頁的Certificates Distribution下載發佈用的Certificate(EX:Ola Engineering Consultants, inc.,Taiwan)<br />
<br />
2. 雙擊兩下進到鑰匙圈的憑證內。<br />
*.若是Provisioning Profiles出現valid signing identity not found,則去檢查鑰匙圈內的憑證是否有跟著對應的鑰匙,若無則必須去取得第一個建立Certificate的人,<br />
利用其電腦匯出p12檔案,再雙擊加入要持圈即可。(或是Revoke企業帳號內的Distribution Certificate並重新建立,但往後有人需使用則必須你電腦匯出的p12檔案)<br />
<br />
3. 建立AppID,該名稱似乎無法刪除與更改,請謹慎命名。(Bundle Identifier可至XCode的targets內summary查。<br />
<br />
5. 至Provisioning的Distribution建立Provision<br />
<br />
6. 選擇In House,輸入Profile name。<br />
<br />
7. 下載後雙擊兩下,進到Xcode Organizer的Provisioning Profiles<br />
<br />
8. 至專案info的Configurations增加Inhouse項目。<br />
<br />
9. 至project/Build Settings/Code Signing Identity,更改Inhouse使用剛剛下載的憑證。<br />
<br />
----------------------------------------------------------<br />
<br />
開始匯出,發佈:<br />
<br />
1. 先準備一個要放置下載位置的網站,於該網站的MIME類型加入ipa與plist<br />
<br />
.ipa | application/octet-stream<br />
.plist | text/xml<br />
<br />
2. 開好要放入下載app資料夾,並記錄該位置(EX:http://ola.com.tw/appdownload/)<br />
<br />
3. 於Xcode選擇Product > Archive > Distribute<br />
<br />
4. 選第二個Save for Enterprise or Ad-Hoc Deployment<br />
<br />
5. 於儲存時,勾選下方的"Save for Enterprise Distribution",並輸入Application URL與Title<br />
Application URL:http://ola.com.tw/appdownload/ola.ipa<br />
Title:ola app<br />
<br />
6. 將匯出後的檔案(ipa與plist)放置到步驟2的位置(EX:ola.com.tw/appdownload/內)<br />
<br />
7. 於上述位置準備下載頁面,下載按鈕撰寫方式如下:<br />
<br />
8. 使用ios產品下載看看。<br />
<br />ola的家http://www.blogger.com/profile/17489699564369049796noreply@blogger.com2tag:blogger.com,1999:blog-379527003650342663.post-28911317666545628062013-03-04T01:12:00.001+08:002013-03-04T01:12:32.972+08:00豐泉台_煞終於倒囉!就在5.2的前夕,豐泉台四王終於倒了!<br />
<div style="text-align: center;">
<a href="http://2.bp.blogspot.com/-e4Xg8kArTKY/UTOD54XNehI/AAAAAAAAFsY/3mnFXBDDyyc/s1600/%E7%85%9E.jpg" imageanchor="1"><img border="0" height="512" src="http://2.bp.blogspot.com/-e4Xg8kArTKY/UTOD54XNehI/AAAAAAAAFsY/3mnFXBDDyyc/s640/%E7%85%9E.jpg" width="640" /></a>
</div>
感謝:阿龍、辰藍、飛魚、若琪、kaka、飆魔、拉拉、真影、努力實習的cc、++與超人氣ola。
<br />
<br />
可以快樂迎接5.2魔獸與蟲族之心了!!
ola的家http://www.blogger.com/profile/17489699564369049796noreply@blogger.com0tag:blogger.com,1999:blog-379527003650342663.post-81542953294403833692013-02-16T13:25:00.002+08:002013-02-16T13:25:50.470+08:00我懂了的實踐!<a href="http://wangshifuola.blogspot.tw/2013/01/blog-post_25.html">1月25日傍晚騎車回家時,突然想懂了一個其實很簡單的概念</a>,一值沒有時間可以來實做看看,最後做了一個簡單的雛型,雖然離預想的成果似乎還有一段差距,而且有非常多額外跑出來的問題,但已經有了整個架構的核心部份,剩下來就是解決這些亂七八糟的問題、逐步完成架構上的模組與重構目前的核心。
<br />
<br />
整個構想只是想處理一個很單純的事情,就是做一個"可能可以實際執行"的dynamic layer離線架構,初步完成了種坐標與屬性查詢。
<br />
<br />
沒什麼意義的系統雛型圖:
<br />
<div style="text-align: center;">
<a href="http://3.bp.blogspot.com/-pJlDsJcrbwo/UR8Oi4parXI/AAAAAAAAFq4/1ycRWof09l8/s1600/offline%E5%AF%A6%E5%81%9A.jpg" imageanchor="1"><img border="0" height="480" src="http://3.bp.blogspot.com/-pJlDsJcrbwo/UR8Oi4parXI/AAAAAAAAFq4/1ycRWof09l8/s640/offline%E5%AF%A6%E5%81%9A.jpg" width="640" /></a></div>
<br />
<br />
很多事情要說出來很難,要想出來很難,但是說完想完要捲起袖子做更難,說和想是個開始,但實踐也還是起頭的一部份;願成為一個能說點話、能想點事情但有手藝的老工匠。ola的家http://www.blogger.com/profile/17489699564369049796noreply@blogger.com0tag:blogger.com,1999:blog-379527003650342663.post-71255317441758391652013-01-25T20:03:00.000+08:002013-01-25T20:03:05.189+08:00阿~~~~我懂了~~~~~最近跟人聊天時,我常常說:「很多事情做了才會在某些時刻激發其他的想法,如果我們一值不嘗試新的東西那麼你就放棄了這些可能突然蹦出來的想法」,就像學寫程式,難道你能肯定學寫vb6完全沒有幫助你更快瞭解asp.net嗎?學寫asp.net沒有幫助你更快學會Flex嗎?學寫Flex沒有影響在Java上的思維?學寫Java沒有讓Objective-C觸類旁通?某些成果常常是由很多事情的累積而成的。<br/>
<br/>
<br/>
但是上面這些跟這篇沒有很大的關係,我只是在騎車回家途中,突然產生一個因為下午測試而讓我現在異常興奮的想法,興奮到一邊騎車一邊突然大叫「阿~~~~我懂了啦~~~~~」<br/>
<br/>
<br/>
:DDDDDDDD<br/>
<br/>
<br/>
key:3 kind of service、small data、local identify
<br/>
<br/>
<br/>
這實在是很值得吃個羊肉盧慶祝一下。ola的家http://www.blogger.com/profile/17489699564369049796noreply@blogger.com0tag:blogger.com,1999:blog-379527003650342663.post-44718760273511204032013-01-25T18:53:00.005+08:002013-01-25T18:57:42.351+08:00ArcGIS Server JS API測試_client端以csv檔案格式於地圖上展點一個突然蹦出來的會議,只好重新打開很久沒開啟的ASP.NET專案,開始對那些新增、刪除、修改的表單做一些很無趣又產量驚人的敲敲打打,但這樣無聊的東西實在是很難連續兩三天,所以今天下午決定挑一個之前有在想、又有趣、又切合目前需求的題目來測試一下,目標:<br />
<br />
<span style="color: #93c47d;">以ArcGIS Server JavaScript API將client端的點資料展在圖面上,並且有簡單的屬性顯示。
</span><br />
<br />
看一下資料格式:
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-RwFDwsjDcE4/UQJgwNUdRMI/AAAAAAAAFmg/pUi1-Gt4dYg/s1600/js%25E5%25B1%2595%25E9%25BB%259E1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="53" src="http://2.bp.blogspot.com/-RwFDwsjDcE4/UQJgwNUdRMI/AAAAAAAAFmg/pUi1-Gt4dYg/s400/js%25E5%25B1%2595%25E9%25BB%259E1.jpg" width="344" /></a></div>
<br />
<br />
成果:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-hIyj_tg91Gc/UQJhxNiH2kI/AAAAAAAAFmw/QpawhCXdD0Y/s1600/js%25E5%25B1%2595%25E9%25BB%259E2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="197" src="http://4.bp.blogspot.com/-hIyj_tg91Gc/UQJhxNiH2kI/AAAAAAAAFmw/QpawhCXdD0Y/s400/js%25E5%25B1%2595%25E9%25BB%259E2.jpg" width="400" /></a></div>
<br />
<br />
心得:<br />
1. 測試1600點一次展繪大約1秒,拖動時的手感也還算順暢。<br />
2. JavaScript真的不好維護,常常因為不小心的錯誤找很久。<br />
3. 這樣的功能要能夠防呆,必須要非常嚴謹的程式碼。<br />
4. 沒有回Server喔! :D<br />
5. 是一個感覺很有用的應用,你懂的,ㄎㄎ。<br />
<br />
<br />
本篇僅紀念js這麼弱的人,半天竟然測出小成果,但是下星期又要回到現實,繼續敲敲打打了。 :D<br />ola的家http://www.blogger.com/profile/17489699564369049796noreply@blogger.com2tag:blogger.com,1999:blog-379527003650342663.post-17384547006137160792013-01-17T21:41:00.000+08:002013-01-28T00:23:24.864+08:00六週年慶六週年,以accepted開頭,勢必需要一個有氣勢的延續,取名在家也可以享受高級餐廳的服務大作戰!<br />
<br />
前菜:洋蔥燻鮭魚<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-gDQij6eVhlo/UPf78RMPNlI/AAAAAAAAFiE/DiKVwSkwptc/s1600/IMG_3639.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-gDQij6eVhlo/UPf78RMPNlI/AAAAAAAAFiE/DiKVwSkwptc/s400/IMG_3639.jpg" height="400" width="300" /></a></div>
配菜:白酒蛤蜊+香炒野菇<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-UynipyGmueY/UPf8aO_wsfI/AAAAAAAAFiQ/g8jD0SwKmYQ/s1600/IMG_3654.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-UynipyGmueY/UPf8aO_wsfI/AAAAAAAAFiQ/g8jD0SwKmYQ/s400/IMG_3654.jpg" height="300" width="400" /></a></div>
湯品:海鮮濃湯<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-qzzhGaqPMc4/UPf82k71dpI/AAAAAAAAFic/_GIy52IFN4c/s1600/IMG_3656.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-qzzhGaqPMc4/UPf82k71dpI/AAAAAAAAFic/_GIy52IFN4c/s400/IMG_3656.jpg" height="400" width="300" /></a></div>
麵包:法式吐司<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-jtbYxDT3qak/UPf9E4hKGJI/AAAAAAAAFio/Wy83P4hVBiQ/s1600/IMG_3662.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-jtbYxDT3qak/UPf9E4hKGJI/AAAAAAAAFio/Wy83P4hVBiQ/s400/IMG_3662.jpg" height="400" width="300" /></a></div>
主菜:香煎羊排<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-pesf6Z_kh0w/UPf9a9bAwmI/AAAAAAAAFi0/kuZSuZuwD2k/s1600/IMG_3668.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-pesf6Z_kh0w/UPf9a9bAwmI/AAAAAAAAFi0/kuZSuZuwD2k/s400/IMG_3668.jpg" height="300" width="400" /></a></div>
飲料:蘋果冰茶<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-6mFlizaEFRU/UPf9rX5ujWI/AAAAAAAAFjA/7BPZ3WPN1yk/s1600/IMG_3692.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-6mFlizaEFRU/UPf9rX5ujWI/AAAAAAAAFjA/7BPZ3WPN1yk/s400/IMG_3692.jpg" height="300" width="400" /></a></div>
甜點:香蕉布朗尼<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-E0Nhq32N8Gw/UPf-LJSFgiI/AAAAAAAAFjY/zoNqzv0qO6E/s1600/IMG_3696.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-E0Nhq32N8Gw/UPf-LJSFgiI/AAAAAAAAFjY/zoNqzv0qO6E/s400/IMG_3696.jpg" height="300" width="400" /></a></div>
六週年快樂。
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-9QoY6a-RRxg/UPf_OR6wGcI/AAAAAAAAFjo/fPjFrXyYQPs/s1600/IMG_3619.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-9QoY6a-RRxg/UPf_OR6wGcI/AAAAAAAAFjo/fPjFrXyYQPs/s400/IMG_3619.jpg" height="400" width="300" /></a></div>
ola的家http://www.blogger.com/profile/17489699564369049796noreply@blogger.com0tag:blogger.com,1999:blog-379527003650342663.post-39327119872648121972013-01-11T16:02:00.000+08:002013-03-22T10:27:55.960+08:00Android學習_如何開始使用Google Maps Android API v2前一陣子想要測試一些Google Map的東西,才發現他默默的在2012年12月3日推出了Google Maps Android API v2(<a href="https://developers.google.com/maps/documentation/android/">官方資料</a>),而原本申請key與使用的方式變的不太一樣。<br />
<br />
要讓手機正確出現Google map需要下列步驟:<br />
1. 建立個人的keystore。<br />
2. 由個人的keystore查詢SHA1碼。<br />
3. 利用SHA1碼至<a href="https://code.google.com/apis/console/">Google apis網站</a>申請key。<br />
4. 於eclipse安裝Google Play services。<br />
5. 於要使用Google Map的專案加入google-play-services_lib的Library。<br />
6. 於專案的AndroidManifest與layout.mal加入需要的設定。<br />
7. 利用第一步驟的keystore匯出專案為apk檔案。<br />
8. 以adb安裝上述apk檔案。<br />
<br />
<br />
詳細步驟:<br />
<b><span style="color: #93c47d;">1. 建立個人的keystore。</span></b><br />
A. 開啟DOS命令視窗,找到java的bin資料夾(C:\Program Files\Java\jre6\bin)<br />
B. 輸入keytool指令(keytool -genkey -v -keystore yourkeyname.keystore -alias yourkeyname -keyalg RSA -keysize 2048 -validity 10000)<br />
輸入後,會有一系列的問題,需要注意的是過程中會輸入兩種密碼,網路上書上都推薦怕記不住就用一樣。<br />
<a href="http://3.bp.blogspot.com/-NEbyE3dFjsY/TsRc2IO8jSI/AAAAAAAABSg/9UmbiNPVFmw/s1600/GMapkey_%25E5%25AF%25A6%25E6%25A9%259F1.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5675763515386531106" src="http://3.bp.blogspot.com/-NEbyE3dFjsY/TsRc2IO8jSI/AAAAAAAABSg/9UmbiNPVFmw/s400/GMapkey_%25E5%25AF%25A6%25E6%25A9%259F1.PNG" style="cursor: hand; cursor: pointer; display: block; height: 307px; margin: 0px auto 10px; text-align: center; width: 400px;" /></a>
<br />
<br />
<b><span style="color: #93c47d;">2. 由個人的keystore查詢SHA1碼。</span></b><br />
A. 還是一樣先開啟DOS命令視窗,找到java的bin資料夾(C:\Program Files\Java\jre6\bin)<br />
B. 使用"既有keystore取得SHA1的語法(keytool -list -v -keystore "C:\Program Files\Java\jre6\bin\yourkeyname.keystore"),鍵入語法後就必須要輸入剛剛建立時所設定的密碼。(語法中加上-v才會顯示SHA1碼)<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-o41BZ6B7le8/UO-9SPogWBI/AAAAAAAAFOY/N3EycDGGgQs/s1600/key%25E7%2594%25A2%25E7%2594%259F2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="264" src="http://2.bp.blogspot.com/-o41BZ6B7le8/UO-9SPogWBI/AAAAAAAAFOY/N3EycDGGgQs/s400/key%25E7%2594%25A2%25E7%2594%259F2.jpg" width="400" /></a></div>
<br />
<br />
<span style="color: #93c47d;"><b>3. 利用SHA1碼至</b></span><a href="https://code.google.com/apis/console/">Google apis網站</a><span style="color: #93c47d;"><b>申請key。</b></span><br />
A. 連至申請網站https://code.google.com/apis/console/ <br />
B. 若是第一次使用按Create Project。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-MpQYSMF7Gcw/UO-9-KoRgwI/AAAAAAAAFOk/EjPKlVHEC3Y/s1600/%25E5%25B0%2588%25E6%25A1%2588%25E7%2594%25B3%25E8%25AB%258B1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="http://3.bp.blogspot.com/-MpQYSMF7Gcw/UO-9-KoRgwI/AAAAAAAAFOk/EjPKlVHEC3Y/s400/%25E5%25B0%2588%25E6%25A1%2588%25E7%2594%25B3%25E8%25AB%258B1.jpg" width="391" /></a></div>
C. 選擇左邊列表的Services,並且將google Maps Android API v2調整成"on"。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-MgPwrqT2yvc/UO--Uig0CEI/AAAAAAAAFOw/fPSU5MuZprw/s1600/%25E5%25B0%2588%25E6%25A1%2588%25E7%2594%25B3%25E8%25AB%258B1_2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="251" src="http://4.bp.blogspot.com/-MgPwrqT2yvc/UO--Uig0CEI/AAAAAAAAFOw/fPSU5MuZprw/s400/%25E5%25B0%2588%25E6%25A1%2588%25E7%2594%25B3%25E8%25AB%258B1_2.jpg" width="204" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-R44UMx4-3Dk/UO--YwD_8JI/AAAAAAAAFO8/RvlypVuBIyk/s1600/%25E5%25B0%2588%25E6%25A1%2588%25E7%2594%25B3%25E8%25AB%258B2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="45" src="http://4.bp.blogspot.com/-R44UMx4-3Dk/UO--YwD_8JI/AAAAAAAAFO8/RvlypVuBIyk/s400/%25E5%25B0%2588%25E6%25A1%2588%25E7%2594%25B3%25E8%25AB%258B2.jpg" width="400" /></a></div>
D. 選擇左邊列表的API Access,並且點擊右下角的Create new Android key。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-GTrBEVnLMWU/UO--x1gLjhI/AAAAAAAAFPI/X_9Pxm-3ilg/s1600/%25E5%25B0%2588%25E6%25A1%2588%25E7%2594%25B3%25E8%25AB%258B3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="264" src="http://4.bp.blogspot.com/-GTrBEVnLMWU/UO--x1gLjhI/AAAAAAAAFPI/X_9Pxm-3ilg/s400/%25E5%25B0%2588%25E6%25A1%2588%25E7%2594%25B3%25E8%25AB%258B3.jpg" width="400" /></a></div>
E. 輸入步驟二得到的SHA1與專案的Package名稱(中間以分號分隔),例:SHA1碼;tw.com.maptest。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-FpF9HJ9VvqQ/UO-_cJ1cp9I/AAAAAAAAFPU/p8BVpTAZPME/s1600/%25E5%25B0%2588%25E6%25A1%2588%25E7%2594%25B3%25E8%25AB%258B4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="277" src="http://2.bp.blogspot.com/-FpF9HJ9VvqQ/UO-_cJ1cp9I/AAAAAAAAFPU/p8BVpTAZPME/s400/%25E5%25B0%2588%25E6%25A1%2588%25E7%2594%25B3%25E8%25AB%258B4.jpg" width="400" /></a></div>
F. 記住API key。<br />
<br />
<br />
<span style="color: #93c47d;"><b>4. 於eclipse安裝Google Play services。</b></span><br />
A. 進入Android SDK Mnanger(eclipse→windows→Android SDK Mnanger)。<br />
B. 安裝Extras的Google Play services。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-dzpzk1DOe-4/UO_Bk27w0PI/AAAAAAAAFQ0/8TdS0xvuS9E/s1600/%25E7%2592%25B0%25E5%25A2%2583%25E8%25A8%25AD%25E5%25AE%259A2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="287" src="http://1.bp.blogspot.com/-dzpzk1DOe-4/UO_Bk27w0PI/AAAAAAAAFQ0/8TdS0xvuS9E/s400/%25E7%2592%25B0%25E5%25A2%2583%25E8%25A8%25AD%25E5%25AE%259A2.jpg" width="400" /></a></div>
<br />
<br />
<b><span style="color: #93c47d;">5. 於要使用Google Map的專案加入google-play-services_lib的Library。</span></b><br />
A. 於eclipse→File→import,選擇Android下的Existing Android Code Into Workspace。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-HhsTR35RZn0/UO_CcDCzxNI/AAAAAAAAFRE/42w1broMDm4/s1600/prj%25E5%25BB%25BA%25E7%25BD%25AE4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="http://1.bp.blogspot.com/-HhsTR35RZn0/UO_CcDCzxNI/AAAAAAAAFRE/42w1broMDm4/s400/prj%25E5%25BB%25BA%25E7%25BD%25AE4.jpg" width="380" /></a></div>
B. 由Browse選擇→[android-sdk-folder]/extras/google/google_play_services/libproject/google-play-services_lib<br />
C. 於要使用Google Map的專案按右鍵,選擇Properties。於左側選單選擇Android,並於下方Library上述加入的專案google-play-services_lib。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-VffiIJzDW4E/UO_D8DtLXwI/AAAAAAAAFT0/NLsaa-5cQyw/s1600/prj%25E5%25BB%25BA%25E7%25BD%25AE3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="377" src="http://1.bp.blogspot.com/-VffiIJzDW4E/UO_D8DtLXwI/AAAAAAAAFT0/NLsaa-5cQyw/s400/prj%25E5%25BB%25BA%25E7%25BD%25AE3.jpg" width="400" /></a></div>
<br />
<br />
<span style="color: #93c47d;"><b>6. 於專案的AndroidManifest與layout.xml加入需要的設定。</b></span><br />
A. 打開AndroidManifest加入必須的設定。<br />
於application標籤之上(注意下述程式碼必須置換yourpackagename成你的package名稱):<br />
<code>
<permission android:name="yourpackagename.permission.MAPS_RECEIVE" android:protectionLevel="signature"/>
<uses-permission android:name="yourpackagename.permission.MAPS_RECEIVE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
</code>
<br />
於application標籤中加入(注意下述程式碼必須置換GoogleMapAPIKey成剛剛申請到的Key):<br />
<code>
<meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="GoogleMapAPIKey"/>
</code>
<br />
於application標籤下加入:<br />
<code>
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
</code>
<br />
B. 打開layout.xml,將介面先改為較單純的內容,待測試OK後再更改為自己需要的介面。<br />
<code>
<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.MapFragment"/>
</code>
<br />
C. java用最單純的內容先進行測試:
<code>
package yourpackageName;
import android.os.Bundle;
import android.app.Activity;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
</code>
<br />
<br />
<span style="color: #93c47d;"><b>7. 利用第一步驟的keystore匯出專案為apk檔案。</b></span><br />
A. 專案右鍵選擇Android Tools→Export Signed Application Package。<br />
B. 依照步驟可以匯出帶有簽章的apk檔案(過程中必須輸入最初設定的keystore密碼)<br />
<br />
<br />
<span style="color: #93c47d;"><b>8. 以adb安裝上述apk檔案。</b></span><br />
A. 利用adb指令(adb install Name.apk)<br />
<br />
最後,執行程式,確認手機有連上網路,迎接你的地圖吧。<br />
<br />
<span style="color: #93c47d;"><b>這篇有幫助到你了話,請留"<u><i>YA~~~看到圖了</i></u>"</b></span>
<br/>
<br/>
<br/>
<span style="color: #93c47d;"><b>2013年3月22日由劉佺網友補充如何在不匯出專案的情況下,使用debug.keystore來進行實機測試:</b></span><br />
以下為完整留言,感謝他的補充:
<br/>
不過隨即發現不用匯出成apk這麼麻煩,如果用他預設的debug.keystore去產生api key,就可以直接從eclipse/Run As去選擇自己的裝置<br/>
預設的debug.keystore可以從Preferences \ Android \ Build \ Default debug keystore去查詢<br/>
步驟二的語法就會變成:keytool -list -v -keystore "C:\Users\使用者名稱\.android\debug.keystore"<br/>
預設的debug.keystore的預設密碼是:android;這樣去申請,DEBUG時測試起來就會比較快(非常多 XD),就不用每次都匯出成專案了<br/>
<br/>
剛才測試的時候發現,申請完以後,如果要改成自己之前新建的keystore<br/>
1. 先查自定密碼的keystore的SHA1碼<br/>
2. 到Google的API Access分頁<br/>
3. 選擇右邊的Edit allowed Android apps...<br/>
4. 將前半的SHA1碼改掉,分號後面的專案名稱不動<br/>
結果API key也不會變動,匯出專案時就可以用自訂的密碼了<br/>
實際安裝起來Google Map也可以正常顯示<br/>
----------------------------------------------------------------ola的家http://www.blogger.com/profile/17489699564369049796noreply@blogger.com90tag:blogger.com,1999:blog-379527003650342663.post-30367427436872637912013-01-10T15:39:00.000+08:002013-01-10T15:39:26.877+08:00SQL_程式無法連線到SQL Server相關問題排解在裝機時其中一個很重要的事情,就是確認程式是否可以正確連線到資料庫,若是無法正常連線,可以逐步測試來確認有可能出問題的設定:
<br />
<br />
0. 確認輸入之伺服器名稱正確,包含安裝兩台以上之SQL Server是否有增加實體名稱(伺服器/實體名稱)<br />
<br />
1. 以本機確認Windows驗證(伺服器/實體名稱)是否可以通過:若是無法通過,應確認SQL Server在安裝時的管理者是否還存在於windows帳號當中,若原設定的管理者被刪除,唯有重建資料庫與重灌一途。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-hthn0gpdxuA/UO5jLhWAz2I/AAAAAAAAFIA/IxRJBz87Vzg/s1600/%25E7%25A8%258B%25E5%25BC%258F%25E9%2580%25A3SQL%25E5%2595%258F%25E9%25A1%258C%25E6%258E%2592%25E8%25A7%25A30.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-hthn0gpdxuA/UO5jLhWAz2I/AAAAAAAAFIA/IxRJBz87Vzg/s400/%25E7%25A8%258B%25E5%25BC%258F%25E9%2580%25A3SQL%25E5%2595%258F%25E9%25A1%258C%25E6%258E%2592%25E8%25A7%25A30.jpg" height="360" width="400" /></a></div>
<br />
2. 以本機確認SQL驗證(伺服器/實體名稱)是否可以通過:若是無法通過,請用管理者帳號確認該SQL帳號是否已於安全性的登入中正確顯示。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-kgnc2yp7CCo/UO5kW8iocTI/AAAAAAAAFIU/ZaBJHiurQ54/s1600/%25E7%25A8%258B%25E5%25BC%258F%25E9%2580%25A3SQL%25E5%2595%258F%25E9%25A1%258C%25E6%258E%2592%25E8%25A7%25A32.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-kgnc2yp7CCo/UO5kW8iocTI/AAAAAAAAFIU/ZaBJHiurQ54/s400/%25E7%25A8%258B%25E5%25BC%258F%25E9%2580%25A3SQL%25E5%2595%258F%25E9%25A1%258C%25E6%258E%2592%25E8%25A7%25A32.jpg" height="319" width="400" /></a></div>
<br />
且確認該資料庫是否設定為"SQL Server及Windows驗證模式。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-gn0TpCpECsU/UO5k8nJNz7I/AAAAAAAAFI8/jcgDhP1pK1c/s1600/%25E7%25A8%258B%25E5%25BC%258F%25E9%2580%25A3SQL%25E5%2595%258F%25E9%25A1%258C%25E6%258E%2592%25E8%25A7%25A3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-gn0TpCpECsU/UO5k8nJNz7I/AAAAAAAAFI8/jcgDhP1pK1c/s400/%25E7%25A8%258B%25E5%25BC%258F%25E9%2580%25A3SQL%25E5%2595%258F%25E9%25A1%258C%25E6%258E%2592%25E8%25A7%25A3.jpg" height="400" width="362" /></a></div>
<br />
<br />
3. 以本機確認SQL驗證(ip/實體名稱)是否可以通過:若是無法通過,至SQL Server組態管理員確認是否有開啟TCP/IP設定。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-8TKG0QV-U9A/UO5lf0M-ycI/AAAAAAAAFJI/H3AdYJOGRG8/s1600/%25E7%25A8%258B%25E5%25BC%258F%25E9%2580%25A3SQL%25E5%2595%258F%25E9%25A1%258C%25E6%258E%2592%25E8%25A7%25A33.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-8TKG0QV-U9A/UO5lf0M-ycI/AAAAAAAAFJI/H3AdYJOGRG8/s400/%25E7%25A8%258B%25E5%25BC%258F%25E9%2580%25A3SQL%25E5%2595%258F%25E9%25A1%258C%25E6%258E%2592%25E8%25A7%25A33.jpg" height="147" width="400" /></a></div>
<br />
4. 以本機確認驗證通過後,是否可以正常開啟要查詢的資料庫:若是跳出無法存取資料庫XXX,則確認該SQL帳號是否有給定存取該資料庫之權限。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-IhEe4tlLePo/UO5ngiDH2iI/AAAAAAAAFJ4/AC3Yw69DdEo/s1600/%25E7%25A8%258B%25E5%25BC%258F%25E9%2580%25A3SQL%25E5%2595%258F%25E9%25A1%258C%25E6%258E%2592%25E8%25A7%25A35.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-IhEe4tlLePo/UO5ngiDH2iI/AAAAAAAAFJ4/AC3Yw69DdEo/s400/%25E7%25A8%258B%25E5%25BC%258F%25E9%2580%25A3SQL%25E5%2595%258F%25E9%25A1%258C%25E6%258E%2592%25E8%25A7%25A35.jpg" height="400" width="361" /></a></div>
<br />
5. 以另一台伺服器測試SQL驗證(ip/實體名稱),若無法連線:<br />
(1) 至SQL Server組態管理員查看ip設定為何?若有指定之port,連線時必須以"ip/實體名稱,port"來連線。
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-HoHPDzfXxI0/UO5omjQ9w6I/AAAAAAAAFKI/OfaFm0cUbug/s1600/%25E7%25A8%258B%25E5%25BC%258F%25E9%2580%25A3SQL%25E5%2595%258F%25E9%25A1%258C%25E6%258E%2592%25E8%25A7%25A36.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-HoHPDzfXxI0/UO5omjQ9w6I/AAAAAAAAFKI/OfaFm0cUbug/s400/%25E7%25A8%258B%25E5%25BC%258F%25E9%2580%25A3SQL%25E5%2595%258F%25E9%25A1%258C%25E6%258E%2592%25E8%25A7%25A36.jpg" height="400" width="367" /></a></div>
(2) 至SQL Server組態管理員或服務管理查看SQL Browser服務是否有開啟。
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-zlgIIaoWnMM/UO5pnoc7hpI/AAAAAAAAFK4/R2jc7rpvS1k/s1600/%25E7%25A8%258B%25E5%25BC%258F%25E9%2580%25A3SQL%25E5%2595%258F%25E9%25A1%258C%25E6%258E%2592%25E8%25A7%25A37.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-zlgIIaoWnMM/UO5pnoc7hpI/AAAAAAAAFK4/R2jc7rpvS1k/s400/%25E7%25A8%258B%25E5%25BC%258F%25E9%2580%25A3SQL%25E5%2595%258F%25E9%25A1%258C%25E6%258E%2592%25E8%25A7%25A37.jpg" height="135" width="400" /></a></div>
(3) 以telnet測試,該port是否可使用。(<a href="http://wangshifuola.blogspot.tw/2011/02/server2008framework35-telnet.html">安裝請參考</a>)
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-zN6BAPbHbq4/UO5qHEOZQiI/AAAAAAAAFLk/l6Yg7LhvvcM/s1600/%25E7%25A8%258B%25E5%25BC%258F%25E9%2580%25A3SQL%25E5%2595%258F%25E9%25A1%258C%25E6%258E%2592%25E8%25A7%25A38.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-zN6BAPbHbq4/UO5qHEOZQiI/AAAAAAAAFLk/l6Yg7LhvvcM/s400/%25E7%25A8%258B%25E5%25BC%258F%25E9%2580%25A3SQL%25E5%2595%258F%25E9%25A1%258C%25E6%258E%2592%25E8%25A7%25A38.jpg" height="103" width="400" /></a></div>
(4) 確認防火牆是否有開啟,若有開啟確認是否有輸入相關規則。(包含:TCP/1433與UDP/1434)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-XxN2TVbbrHA/UO5uMsE_roI/AAAAAAAAFMU/LJKAbC1JEQs/s1600/%25E7%25A8%258B%25E5%25BC%258F%25E9%2580%25A3SQL%25E5%2595%258F%25E9%25A1%258C%25E6%258E%2592%25E8%25A7%25A39.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-XxN2TVbbrHA/UO5uMsE_roI/AAAAAAAAFMU/LJKAbC1JEQs/s400/%25E7%25A8%258B%25E5%25BC%258F%25E9%2580%25A3SQL%25E5%2595%258F%25E9%25A1%258C%25E6%258E%2592%25E8%25A7%25A39.jpg" height="400" width="323" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-sGM0JvGSxno/UO5uRXMlbUI/AAAAAAAAFMg/Iw4gmdair98/s1600/%25E7%25A8%258B%25E5%25BC%258F%25E9%2580%25A3SQL%25E5%2595%258F%25E9%25A1%258C%25E6%258E%2592%25E8%25A7%25A310.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-sGM0JvGSxno/UO5uRXMlbUI/AAAAAAAAFMg/Iw4gmdair98/s400/%25E7%25A8%258B%25E5%25BC%258F%25E9%2580%25A3SQL%25E5%2595%258F%25E9%25A1%258C%25E6%258E%2592%25E8%25A7%25A310.jpg" height="298" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-g-EJUTPwVXs/UO5uX6JOQeI/AAAAAAAAFMw/lTObtbKuCHU/s1600/%25E7%25A8%258B%25E5%25BC%258F%25E9%2580%25A3SQL%25E5%2595%258F%25E9%25A1%258C%25E6%258E%2592%25E8%25A7%25A311.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-g-EJUTPwVXs/UO5uX6JOQeI/AAAAAAAAFMw/lTObtbKuCHU/s400/%25E7%25A8%258B%25E5%25BC%258F%25E9%2580%25A3SQL%25E5%2595%258F%25E9%25A1%258C%25E6%258E%2592%25E8%25A7%25A311.jpg" height="296" width="400" /></a></div>
(5) 若是express版本,沒有指定特定port,而使用動態port,則需增加規則。(讓sqlserver.exe可穿越防火牆)<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-NHHDF--HPL0/UO5vSScZf0I/AAAAAAAAFM8/TNHNFOgX96E/s1600/%25E7%25A8%258B%25E5%25BC%258F%25E9%2580%25A3SQL%25E5%2595%258F%25E9%25A1%258C%25E6%258E%2592%25E8%25A7%25A312.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-NHHDF--HPL0/UO5vSScZf0I/AAAAAAAAFM8/TNHNFOgX96E/s400/%25E7%25A8%258B%25E5%25BC%258F%25E9%2580%25A3SQL%25E5%2595%258F%25E9%25A1%258C%25E6%258E%2592%25E8%25A7%25A312.jpg" height="298" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-yvwvRGrwxTM/UO5vWLJmyBI/AAAAAAAAFNI/xqNdLQS1DWo/s1600/%25E7%25A8%258B%25E5%25BC%258F%25E9%2580%25A3SQL%25E5%2595%258F%25E9%25A1%258C%25E6%258E%2592%25E8%25A7%25A313.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-yvwvRGrwxTM/UO5vWLJmyBI/AAAAAAAAFNI/xqNdLQS1DWo/s400/%25E7%25A8%258B%25E5%25BC%258F%25E9%2580%25A3SQL%25E5%2595%258F%25E9%25A1%258C%25E6%258E%2592%25E8%25A7%25A313.jpg" height="297" width="400" /></a></div>
<br />
*.但微軟於官方文件提到:另一種設定具名執行個體到固定通訊埠的方法,就是在防火牆中為像是 sqlservr.exe (針對 Database Engine) 等 SQL Server 程式,建立例外。 雖然這樣做很方便,但是當您使用具有進階安全性 MMC 嵌入式管理單元的 Windows 防火牆時,其通訊埠編號將不會顯示在 [輸入規則] 頁面的 [本機通訊埠] 欄中。 如此一來可能會讓您更難以稽核哪些通訊埠已開啟。其他考量是 Service Pack 或累積更新可能會變更 SQL Server 可執行檔的路徑,因而使防火牆規則失效。<br />
<br />
(6) 詢問該單位網路管理員,是否有別的防火牆設備或軟體,請他開啟相關連接埠。<br/>
<br/>
<br/>
以上,若是還是無法正常連接資料庫,那就回家休息一下。ola的家http://www.blogger.com/profile/17489699564369049796noreply@blogger.com0tag:blogger.com,1999:blog-379527003650342663.post-90156129133914259802012-12-01T21:33:00.002+08:002012-12-01T21:36:25.685+08:00Ola的家 最新力作 2012年冬季鉅獻<iframe width="560" height="315" src="http://www.youtube.com/embed/aLUK8xXcQGA" frameborder="0" allowfullscreen></iframe>ola的家http://www.blogger.com/profile/17489699564369049796noreply@blogger.com0tag:blogger.com,1999:blog-379527003650342663.post-8156677975004246002012-11-26T21:01:00.003+08:002012-11-26T21:06:27.696+08:00複雜的心情2012年7月27日我存下人生中的第一個PSD檔。<br />
<br />
今天,2012年11月26日最新完成的照片標註介面:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-79upTynXR14/ULNmhlO4p0I/AAAAAAAAFF8/Zeonmee6MiA/s1600/image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="http://4.bp.blogspot.com/-79upTynXR14/ULNmhlO4p0I/AAAAAAAAFF8/Zeonmee6MiA/s400/image.png" width="400" /></a></div>
<br/>
我只想對自己說「喜歡嗎?」 (笑)
ola的家http://www.blogger.com/profile/17489699564369049796noreply@blogger.com0tag:blogger.com,1999:blog-379527003650342663.post-82894940081908851002012-11-21T10:22:00.003+08:002012-11-21T10:22:57.568+08:00iOS分享_如何使用Xcode內建工具找到記憶體洩漏(Memory Leak)不管你是自修或是到外面上課,書本或是講師一定會告訴你“管理記憶體”非常的重要,而記憶體管理對於有C語言底子的人可能非常的自然,但是對於其他程式語言起家的程式設計師(諸如我),倒是一件幾乎完全從零開始的事情;因為知道要管理,我們會在撰寫iOS時自以為地使用alloc分配記憶體,再在自覺得適當的時刻利用release將其釋放掉,當我們完成一個階段並且開始在模擬器或實機跑時,發現程式正常運作,那麼我們可能自我感覺良好的認為完成了一個很OK的程式。<br />
<br />
但是其實有時候可能在某些呼叫的方法上,iOS會自己管理記憶體,並不需要你去觸碰,也有可能在不同function間傳遞時因為操作有誤,導致每次呼叫便使得retaincount不斷上升,而記憶體管理需要不斷地學習,瞭解需要管理與釋放的變數與釋放的時機。<br />
<br />
本篇並沒有要提及如何寫出良好記憶體管理的方法,我也沒有能力寫出這樣偉大的文章,但即使我們沒有辦法一次就達到完善的記憶體管理,卻可以經過一些工具一步步向前。<br />
<br />
截至目前為止,我所知道要尋找Memory Leak的方法有兩個,你應該針對你的程式先完成第一個測試,再進一步完成第二個,直至程式修改成你所接受的記憶體管理:<br />
<br />
1. 使用Xcode的Analyze功能。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-IPwisleAVns/UKwqn9LaCVI/AAAAAAAAFC4/tHiag9B57ls/s1600/MemoryLeak_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="http://4.bp.blogspot.com/-IPwisleAVns/UKwqn9LaCVI/AAAAAAAAFC4/tHiag9B57ls/s400/MemoryLeak_1.png" width="205" /></a></div>
<br />
這個功能可以幫助你去尋找程式碼中,有建立記憶體空間卻沒有釋放的位置,我們將一個release註解來看看他的結果:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-5ZZde5JJvdE/UKwr6Y9nLXI/AAAAAAAAFDE/ECkkM9swj7c/s1600/MemoryLeak_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="55" src="http://3.bp.blogspot.com/-5ZZde5JJvdE/UKwr6Y9nLXI/AAAAAAAAFDE/ECkkM9swj7c/s400/MemoryLeak_2.png" width="400" /></a></div>
<br />
接著你可以對他點擊,以獲取更多的資訊。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-JG5TuOlFHt8/UKwsXBCdktI/AAAAAAAAFDQ/4STrWAgTzrQ/s1600/MemoryLeak_3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="83" src="http://4.bp.blogspot.com/-JG5TuOlFHt8/UKwsXBCdktI/AAAAAAAAFDQ/4STrWAgTzrQ/s400/MemoryLeak_3.png" width="400" /></a></div>
<br />
這一個測試僅能以編譯的手段,去尋找那些你可能忘記釋放的地方,也就是你必須要釋放的那些變數,所以最基本的要求就是讓該測試沒有任何提醒。但即便該測試完成,也不代表該程式在執行階段不會發生Memory Leak的問題,原因是有可能程式需要上傳相片,那麼我們會使用[NSData dataWithContentsOfFile:filePath];的方式將檔案轉為NSData,再傳送出去,而在從檔案轉成NSData到上傳的過程中,會使用非常多變數與方法,其中一個該釋放但未釋放,則可能造成暫存該檔案的空間一直存在,所以當你不斷進行上傳的動作,會發現你的程式似乎越來越慢?直到Crash為止。<br />
<br />
所以我們必須藉由第二個工具來輔助我們尋找程式運行中可能的記憶體洩漏。<br />
<br />
2. 使用Xcode的Profile工具。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-joftSpp_TtE/UKwvRvWWDmI/AAAAAAAAFD8/EZA0mjKHfzA/s1600/MemoryLeak_4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="http://3.bp.blogspot.com/-joftSpp_TtE/UKwvRvWWDmI/AAAAAAAAFD8/EZA0mjKHfzA/s400/MemoryLeak_4.png" width="206" /></a></div>
<br />
點擊後會新開一個名叫Instruments的程式,選Leaks後點擊Profile。
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-ibX6dlkKLCs/UKwv22yrv2I/AAAAAAAAFEI/wo3tpJg6dTE/s1600/MemoryLeak_5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="330" src="http://1.bp.blogspot.com/-ibX6dlkKLCs/UKwv22yrv2I/AAAAAAAAFEI/wo3tpJg6dTE/s400/MemoryLeak_5.png" width="400" /></a></div>
<br />
你的程式會開始運作,並且跑出一些好像在監測什麼的圖表?<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-4vRp4WrbvnM/UKwwXYlnaRI/AAAAAAAAFEU/NsjWcFsvHbY/s1600/MemoryLeak_6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="282" src="http://3.bp.blogspot.com/-4vRp4WrbvnM/UKwwXYlnaRI/AAAAAAAAFEU/NsjWcFsvHbY/s400/MemoryLeak_6.png" width="400" /></a></div>
<br/>
接著你可以試著操作程式,會發現該圖表不斷的跳動,<br/>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-hXCwsovF638/UKww0kUXQ0I/AAAAAAAAFEg/tPMKhQmSnfw/s1600/MemoryLeak_7.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="282" width="400" src="http://4.bp.blogspot.com/-hXCwsovF638/UKww0kUXQ0I/AAAAAAAAFEg/tPMKhQmSnfw/s400/MemoryLeak_7.png" /></a></div>
<br/>
而這個名為Allocations就是程式記憶體的分配,你可以藉由觀察下方表格的All Allocations*來得知目前的總使用量,若是你不斷地在頁面間來回反覆操作一樣的動作,而該記憶體用量只增不減,就代表在這個動作的過程中,應該有一些需要調整的地方。<br/>
<br/>
當然,我們不能僅藉由這樣的方式來找尋應該要修改的地方,點選左邊的Leaks區域,會進到Leaks的監測畫面:
<br/>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-tE8bwl0eisM/UKwyC1ZZx-I/AAAAAAAAFEs/HjPZrXDV7hE/s1600/MemoryLeak_8.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="282" width="400" src="http://3.bp.blogspot.com/-tE8bwl0eisM/UKwyC1ZZx-I/AAAAAAAAFEs/HjPZrXDV7hE/s400/MemoryLeak_8.png" /></a></div>
<br/>
接著在繪圖區與表格區中間,有一個“田”Leaks,點選後選擇Call Tree:<br/>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-vZ384ug0bWQ/UKwyx-p5XFI/AAAAAAAAFE4/kJX2v64Du6o/s1600/MemoryLeak_9.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="282" width="400" src="http://3.bp.blogspot.com/-vZ384ug0bWQ/UKwyx-p5XFI/AAAAAAAAFE4/kJX2v64Du6o/s400/MemoryLeak_9.png" /></a></div>
最後將左側的Hide System Libraries與Invert Call Tree打勾(Hide System Libraries幫助你只檢視自己程式的問題,Invert Call Tree是將檢視的過程顛倒,讓你馬上可以點到出問題的最後一段程式碼),讓我們製造一些Leak的問題,可以看到該工具會將Leak列表:<br/>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-_1jqk9wr4l4/UKw0LYFcNAI/AAAAAAAAFFE/sY-lHQsRt3U/s1600/MemoryLeak_10.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="282" width="400" src="http://4.bp.blogspot.com/-_1jqk9wr4l4/UKw0LYFcNAI/AAAAAAAAFFE/sY-lHQsRt3U/s400/MemoryLeak_10.png" /></a></div>
<br/>
雙擊列表兩下則可以得知“可能”出錯的位置:<br/>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-HbRQrJrzI2w/UKw1DTNCnrI/AAAAAAAAFFQ/fhxNctequro/s1600/MemoryLeak_11.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="282" width="400" src="http://2.bp.blogspot.com/-HbRQrJrzI2w/UKw1DTNCnrI/AAAAAAAAFFQ/fhxNctequro/s400/MemoryLeak_11.png" /></a></div>
<br/>
最後,你可以嘗試的修復這些洩漏,直到程式運作過程完全沒有為止。<br/>
<br/>
講起來有工具而且已經幫助你找到相關位置,理論上應該很容易解決這些問題?但實際上這些Memory Leak的問題通常會牽扯到不同函式間的呼叫,洩漏的位置往往不是問題的原因。連續一個星期都在處理Leak相關問題,這實在比平常在解決其他程式語言的問題時更加令人惱羞,更深深感覺每一個問題的解決背後真的需要很多知識的累積,近一兩年常有人問我要學什麼語言?學什麼最好?某語言好學嗎?我的答案總是讓人不以為然:<br/>
<br/>
你有心學就可以學起來,實際打開電腦寫遠比一直想著要不要學有用多了,而每一種語言的特性都有可能讓你更瞭解別種語言,如果你要學的是if跟for,那什麼都可以學,我第一個學的是MATLAB。ola的家http://www.blogger.com/profile/17489699564369049796noreply@blogger.com0tag:blogger.com,1999:blog-379527003650342663.post-19724361113702703552012-11-13T14:30:00.001+08:002012-11-13T14:30:33.372+08:00iOS學習_如何較易找到exc_bad_access錯誤的源頭"exc_bad_access"是一個令人惱羞的錯誤訊息,出現的原因是“使用了已經釋放記憶體的變數”,如果你很希望好操作程式的記憶體,那就很可能在觀念不清楚的狀態下一直遇到這一個錯誤。<br/>
<br/>
而之所以說很令人惱羞,log並不會顯示任何資訊來供我們判斷,這時可在環境變數中增加一個參數(NSZombieEnabled),來增加判斷的資訊。<br/>
<br/>
步驟:<br/>
1. 於選單Product選擇Edit Scheme。<br/>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-VXUUbKzrbqs/UKHoK8Hli4I/AAAAAAAAFBU/Qs5qjbUFnVI/s1600/exc_error%25E6%2589%25BE%25E9%258C%25AF%25E8%25AA%25A4%25E4%25BD%258D%25E7%25BD%25AE_1.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="400" width="208" src="http://4.bp.blogspot.com/-VXUUbKzrbqs/UKHoK8Hli4I/AAAAAAAAFBU/Qs5qjbUFnVI/s400/exc_error%25E6%2589%25BE%25E9%258C%25AF%25E8%25AA%25A4%25E4%25BD%258D%25E7%25BD%25AE_1.png" /></a></div>
<br/>
2. 於Arguments的Environment Variables增加參數NSZombieEnabled,並設定為YES。<br/>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-UwdGyspmauo/UKHoi_m-tDI/AAAAAAAAFBg/pDnxIRU-ScE/s1600/exc_error%25E6%2589%25BE%25E9%258C%25AF%25E8%25AA%25A4%25E4%25BD%258D%25E7%25BD%25AE_2.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="272" width="400" src="http://1.bp.blogspot.com/-UwdGyspmauo/UKHoi_m-tDI/AAAAAAAAFBg/pDnxIRU-ScE/s400/exc_error%25E6%2589%25BE%25E9%258C%25AF%25E8%25AA%25A4%25E4%25BD%258D%25E7%25BD%25AE_2.png" /></a></div>
<br/>
這時就可以看到錯誤時會多出一句相關錯誤的log。(EX:[__NSArrayM count]: message sent to deallocated instance 0x9bb5620)<br/>
然後再配合Xcode左側的Thread列表,來查找可能的位置與原因。<br/>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-G517ZghlIeg/UKHlteHYb2I/AAAAAAAAFAo/v3ooY-izNv0/s1600/exc_error%25E6%2589%25BE%25E9%258C%25AF%25E8%25AA%25A4%25E4%25BD%258D%25E7%25BD%25AE_3.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="400" width="249" src="http://1.bp.blogspot.com/-G517ZghlIeg/UKHlteHYb2I/AAAAAAAAFAo/v3ooY-izNv0/s400/exc_error%25E6%2589%25BE%25E9%258C%25AF%25E8%25AA%25A4%25E4%25BD%258D%25E7%25BD%25AE_3.png" /></a></div>
方法ola的家http://www.blogger.com/profile/17489699564369049796noreply@blogger.com0tag:blogger.com,1999:blog-379527003650342663.post-38854750961320322592012-11-13T13:45:00.001+08:002012-11-13T13:46:38.176+08:00iOS學習_返回NSMutableArray的函式要正確release的方法(ola的猜測)本文章為筆者自行觀念的瞭解,無法保證一定正確。
-------------------------------------------
NSMutableArray是一個非常好用的型態,我們可以將他看作一個物件陣列(<a href="http://wangshifuola.blogspot.tw/2012/05/iosnsmutablearraynsmutabledictionary.html">操作方法</a>),慢慢的我們會將處理NSMutableArray獨立出一個一個方法,類似下面的程式碼:<br/>
<code>
-(NSMutableArray *)selectReportingMain_All
</code>
<br/>
而函式的內容不外乎alloc一個NSMutableArray,然後將適當的物件放進去,在return NSMutableArray:
<br/>
<code>
-(NSMutableArray *)selectReportingMain_All
{
NSMutableArray *items = [[NSMutableArray alloc] init];
if ([db open])
{
FMResultSet *rs = [db executeQuery:@"SELECT * From reportingMain"];
while ([rs next]) {
NSString *reportingID = [rs stringForColumn:@"reportingID"];
NSString *title = [rs stringForColumn:@"title"];
NSString *note = [rs stringForColumn:@"note"];
NSString *xValue = [rs stringForColumn:@"xValue"];
NSString *yValue = [rs stringForColumn:@"yValue"];
NSString *time = [rs stringForColumn:@"time"];
NSString *status = [rs stringForColumn:@"status"];
[items addObject:[NSDictionary dictionaryWithObjectsAndKeys:
reportingID , @"reportingID",
title , @"title",
note , @"note",
xValue , @"xValue",
yValue , @"yValue",
time , @"time",
status , @"status",
nil]];
}
}
[db close];
return items;
}
</code>
<br/>
上述程式碼為SQLite查詢的操作,這樣就可以簡單的將資料庫操作與界面做一個簡單的切割,但是觀察上面的程式碼可能會覺得有點詭異?<br/>
我們並沒有釋放items,難道每一次地使用就會不斷佔用記憶體嗎?這豈不是慢性自殺?<br/>
<br/>
所以必須在適當的時機點進行釋放,所謂適當的時機就是“立刻”。
<code>
return [items autorelease];
</code>
<br/>
如此,我們即可確保該NSMutableArray有被進行釋放。但通常會去接這一個NSMutableArray的介面都會準備一個全域變數,來承接吐出來的結果。<br/>
<code>
dbOperating *dbO = [[dbOperating alloc] init];
itembag = [dbO selectReportingMain_All];
NSLog(@"items retain:%d",items.retainCount);
[dbO release];
</code>
上述程式碼itembag可以很順利地取得結果,但是當該介面的其他函示需要進行操作時,則會產生“exc_bad_access”的錯誤,也就是說你使用了已經釋放的變數。<br/>
<br/>
解決方法:
<code>
dbOperating *dbO = [[dbOperating alloc] init];
itembag = [dbO selectReportingMain_All];
[itembag retain];
NSLog(@"items retain:%d",items.retainCount);
[dbO release];
</code>
手動增加itembag的retainCount,這時如果將retainCount輸出,會看到在上述程式碼內retainCount為2,但因回傳的變數是使用[items autorelease],所以隨即retainCount會降為1,並且也可以正常的讀取使用itembag裡面的值。
ola的家http://www.blogger.com/profile/17489699564369049796noreply@blogger.com0