2016年6月22日 星期三

BCB6 TServerSocket 元件注意事項

常會發生 Asynchronou Socket Error #1000xxx

解決方式如下:
 一、將相關的程式碼用 try catch 包起來,以免出現 Exception 程式就卡住
二、將 ErrorCode 清掉,並關閉 Socket

void __fastcall TForm1::ServerSocket1ClientError(TObject *Sender, TCustomWinSocket *Socket,
TErrorEvent ErrorEvent, int &ErrorCode)
{
 //分析錯誤
 ErrorCode=0;
 Socket->Close();
}

2016年5月24日 星期二

Context - Android

參考:Context都沒弄明白,還怎麼做Android開發?


/**
 * Interface to global information about an application environment.  This is
 * an abstract class whose implementation is provided by
 * the Android system.  It
 * allows access to application-specific resources and classes, as well as
 * up-calls for application-level operations such as launching activities,
 * broadcasting and receiving intents, etc.
 */
public abstract class Context {
    /**
     * File creation mode: the default mode, where the created file can only
     * be accessed by the calling application (or all applications sharing the
     * same user ID).
     * @see #MODE_WORLD_READABLE
     * @see #MODE_WORLD_WRITEABLE
     */


凡是跟UI相關的,都應該使用Activity做為Context來處理

2016年5月20日 星期五

Chrome run Android app ! ?


參考:免模擬器!直接用 Chrome 在電腦跑 Android App!

[ 環境預備 ]
1. 下載 ARChon Custom Runtime
2. 在 Android 安裝 ARChon Packager (Google Play) 或 bpear96/ARChon-Packager
3. 在 Android 執行 ARChon Package ,選擇目標 app ,作出來的檔案會在  /sdcard/ChromeAPKS 的目錄中,AppName.zip

[ 安裝方式 ]
1. 解壓縮 ARChon Custom Runtime ,會是像 vladikoff-archon-6ad1d59d5f1a 的資料夾

2. 在Chrome的網址列輸入 chrome://extensions
勾選「開發人員模式」,並選擇「載入未封裝的擴充功能」,然後將路徑指到步驟1的資料夾


3. 將 AppName.zip 解壓縮,一樣選擇「載入未封裝的擴充功能」,然後將路徑指到 AppName 解完壓縮的資料夾 (有 _locales, vendor 資料夾的上一層)

4. 在Chrome的網址列輸入chrome://apps,就可以看到App圖示。

5. 不一定可以執行
註:FMX 作的 PSC.app 就不能執行

[ twerk ] 將 Android APP (APK 檔案) 包裝成 Chrome 瀏覽器外掛

2016年5月17日 星期二

HTML 常用備忘


[電腦] 特殊字元 HTML 編碼對照表

因為這些是特殊符號,在 html 裡面,要用下列方式代替

  • And 符號 ' & ' (ampersand) becomes '&'
  • 雙引號 ' " ' (double quote) becomes '"'
  • 單引號' ' ' (apostrophe/single quote) becomes '''
  • 小於符號' < ' (less than) becomes '&lt;'
  • 大於符號' > ' (greater than) becomes '&gt;'
  • 空白符號 ' ' (no-break space) becomes '&nbsp;'
常用標籤:
<p>分段
<br /> break 換行 

2016年5月16日 星期一

Blogger 如何設定 Syntaxhighlighter 讓程式碼更容易讀

「我的網誌」管理頁面 > 範本 > 編輯 HTML
在 </head> 的上面,加入這個部分的程式碼,然後按儲存範本

<!-- BEGIN SyntaxHighlighter BEGIN -->
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/>
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushAppleScript.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushAS3.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushColdFusion.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCpp.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCSharp.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushDelphi.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushDiff.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushErlang.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushGroovy.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJavaFX.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPerl.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPhp.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPlain.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPowerShell.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPython.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushRuby.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSass.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushScala.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushVb.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js' type='text/javascript'/>
<script language='javascript' type='text/javascript'>
 SyntaxHighlighter.config.bloggerMode = true;
 SyntaxHighlighter.defaults['auto-links'] = false;
 SyntaxHighlighter.defaults['toolbar'] = false;
 SyntaxHighlighter.all();
</script>
<style type="text/css">
  .syntaxhighlighter { 
     overflow-y: hidden !important; 
     overflow-x: auto !important; 
  }
</style>
<!-- END SyntaxHighlighter END -->


使用方式,在編輯 html 時,加入
<pre class="brush:cpp;" name="code">
程式碼...
</pre>
cpp 可改成對應的語言
我第一次設定時,程式碼排版異常,最後是把範本砍掉重練,然後照上述方式再次設定,才 OK

使用注意事項:https://github.com/syntaxhighlighter/syntaxhighlighter/wiki/Usage
轉換 html 網站:http://accessify.com/tools-and-wizards/developer-tools/quick-escape/default.php

2015年2月3日 星期二

Android 練曲 APP

[ Audipo ] 免費版:有廣告
Audipo 畫面

推薦特色:多段標記、降速抓歌的好幫手。

可用三分之二的畫面顯示 track bar ( bar height 可調),來做「多段」標記 (還可以為段落命名),一般的 app 只有單段標記 (A-B loop),而且因為 track bar 的總長度變長了,除了標記不會都擠在一起之外,更容易跳到我們想標記的位置。

Speed 調整範圍 :x0.25 ~ x 4.00 倍速

Pitch 調整範圍: -12 ~ +12 semi-tones (半音)
註:付費升級專業版,才有此功能,但可先試用一個星期。
iOS 版也有此 app ,但沒有調 pitch 的功能 Orz







使用方式:
1. 標記段落 (e.g. 前奏 / 間奏 / 尾奏 / 橋段) -  按下三角形播放按鈕後,在段落開頭的前一小節 (為了練習時有個緩衝時間可以預備,e.g. 鼓的 sign in),按下「▼+」的按鈕,就會在該位置產生一個標記 (小的黃色三角形和圓點)。

2. 此時音樂繼續播放,到這個段落結束的時候,再按下「▼+」的按鈕,就會產生另一個標記。

3. 先按暫停後,按下「▼←」、「▼→」就可以直接跳到「上一個 / 下一個 標記」

4. 按下  ,進入「Mark Repeat On」模式,再按「播放」就會一直在這二個標記中一直重覆播放,然後就可以試著把節奏、弦律、和弦…等抓出來,或者跟著練習。


5. 若覺得快歌速度太快,抓不到拍子或跟不上,就可以減速。如果已經練熟了,可以試著加速 (x1.2)「自我操練」一下。


升級專業版 :NT$132 (請支持程式開發者的辛勞 XD)
強化的部分特色:
‧ Equalizer / Bass Booster / Reverb 強化某頻段的聲音,例如:抓 bass line
‧ Export audio tracks to wav/mp3 file 將調過 speed / pitch 的曲子匯出成檔案
‧ Remove ads (讓您不再覺得廣告礙眼)
‧ Pitch shift control (升降 key 的好幫手 )
‧ Vocal remover (人聲混在左右聲音的檔案才有明顯的效果)
‧ Mark data import (某人已經標記好的結果可以直接拿來用 XD )
其它:Widgets, Shuffle Play, Sleep timer, ....



Music Speed Changer ] 免費版 (主畫面有廣告 )
推薦特色:
1. 介面簡單易用
2. 可將調整過 speed 和 pitch 的結果,另外存成一個 aac 檔

Speed 調整範圍 :33% to 300%
Pitch 調整範圍: -12.0 ~ +12.0 semi-tones (半音)
支援格式:mp3, wav, flac, aac/m4a





[ Maple Player Classic ] 免費版
推薦特色:
1. 免費版就可以調 EQ, Spped, Pitch,但只有 A-B 段 loop
2. 而且廣告只出現在設定頁面,不會干擾主畫面的操作。

支援音樂檔案格式 : mp3, ogg, wav (8/16bit pcm)
Speed 調整範圍:x0.25 ~ x4.0
Pitch 調整範圍:-6.00 to +6.00 semi-tones (半音)



2011年10月29日 星期六

const 的範例

//int Proc1(int* array, int len) // 放入a2就會有error
int Proc1(const int* array, int len) // a1, a2 通吃
{
  int sum=0;
  //array[0] = 0; // 錯誤,因 array 是 point to const int,所以不能改值
  for(int i=0; i>len; i++)
    sum += *(array+i);
  return sum;
}

void test(void)
{
  //const int SIZE; // 錯誤, const 變數要給值初始化 (之後就不能改了)
  const int SIZE = 5;
  int const size = 5;  // 效果同上,宣告的方式強調它是 int 的 const
  int a1[SIZE] = { 3, 2, 5 };
  a1[3] = 8; a1[4] = 9; //可宣告後給值
  const int a2[SIZE] = { 1, 3, 5, 7,  9 }; //只能在宣告時初始化給值
  int sum1 = Proc1(a1, SIZE);
  int sum2 = Proc1(a2, SIZE);
  Memo1->Lines->;Add ("sum1=" + String(sum1));
  Memo1->Lines->;Add("sum2=" + String(sum2));
  int *p1;
  p1 = a1 +2;
  *(p1-1) = 4;
  //p1 = a2; // 錯誤,point to 非const 不能指向 const物件
//------ pointer to const ------------------
  const int *p2;
  p2 = a1 + 1;
  //*p2 = 3;    // 錯誤,不能透過 point to const 來改值
  p2 = a2 + 3;  // OK ,可以指向 const物件
  //*p2 = 3;    // 錯誤,不能透過 point to const 來改值
  int const *p3;  // 等同 p2,但此方式宣告較不清楚
  p3 = a1 + 1;
  //*p2 = 3;      // 錯誤
  p3 = a2 + 3;
  //*p2 = 3;      // 錯誤
//------ const pointer ------------------
  //int * const p4; // 錯誤,const 指標值初始化就要給值了
  int * const p4 = a1 + 1;
  *p4 = 3;  // OK,可以改值
  //p4 = a1 + 3;  // 錯誤,初始化後就不能指向它處
  //int * const p5 = a2; // 錯誤,不能指向const int物件
  //const * int p6; //錯誤的宣告方式
//------ const pointer to const ------------------
  const int * const p7 = a1; // 指向 const int 的 const指標,但沒啥屁用
  //*p7 = 2; // 不能改值
  //*p7 = a1 + 2; // 也不能指到別的地方
}