2013年10月12日 星期六

轉站!

網誌要搬家囉~

要搬去 Logdown 歡迎大家有問題可以Email

Email: quietmes@gmail.com
Facebook: doublejiun
Github: jiunjiun

2013年6月9日 星期日

Android Studio import ActionBarSherlock(2)

上次寫了一個範例,發現在Android Studio的import分兩種一種是對程式

一個是對整個project,要兩個都引入才算真的import!!

這次就來真正完整教學!!


這次就略過開新專案的過程直接進到主題

專案名稱: MyApplicationProject

首先先 Actionbarsherlock 下載 Lib下來

Github:   https://github.com/JakeWharton/ActionBarSherlock
Website: http://actionbarsherlock.com/

接著再裡面找他的Lib /actionbarsherlock

然後再把它拉到你的專案下面,我Actionbarsherlock是放桌面
至於你的路徑在哪就在哪邊去建立
mkdir libraries
cp -r ~/Desktop/JakeWharton-ActionBarSherlock-071a61c/actionbarsherlock libraries/


在MyApplicationProject目錄下的 settings.gradle 加入這一行
include ':libraries:actionbarsherlock'

在到MyApplicationProject/MyApplication/build.gradle 裡面的 dependencies {...}加入下面
*在這裡我們把compile files('libs/android-support-v4.jar')
因為Actionbarsherlock本身就有引入這個jar就可以拿掉
dependencies {
    compile project(':libraries:actionbarsherlock')
}



接著再 MyApplicationProject/libraries/actionbarsherlock/ 新增 build.gradle
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.4'
    }
}
apply plugin: 'android-library'
 
dependencies {
    compile files('libs/android-support-v4.jar')
    compile files('libs/android-support-v13.jar')
}
 
android {
    compileSdkVersion 17
    buildToolsVersion "17"
 
    defaultConfig {
        minSdkVersion 7
        targetSdkVersion 16
    }
 
 
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }
 
        instrumentTest.setRoot('tests')
    }
 
} 


接著再把它包進去到,在到command line(命令提示字元\終端機)
MyApplicationProject目錄下key
./gradlew build

如果你是Windows,就是下面
./gradlew.bat build

然後他就會開始跑跑跑,跑完就完成!


參考資料:http://rsproglog.blogspot.tw/2013/05/gradle-new-android-build-system_21.html

2013年5月20日 星期一

Android Studio import ActionBarSherlock(1)

Android Studio 這個新的IDE剛起步,有些還不熟悉

就馬上遇到第一個問題!! 怎麼import ActionBarSherlock!!

Google跟亂試,結果得到一個結果


1.首先先去Actionbarsherlock下載或是github



2.Android Studio開新專案,這步驟就當做大家都會!!

3.Android Studio Setting...


  3-1. 開啟 Project Structure

  3-2. 左邊 Project Settings -> Libraries 刪除原先android-support-v4(在ActionBarSherlock已經有import了,所以在這邊刪除他

  3-3. 左邊 Project Settings -> Modules 並在中間點選Import Module加入actionBarSherlock Module



  3-4. 接下來會出現一堆視窗都直接下一步下一步下一步下一步下一步下一步....一直到完成

  3-5. 接著在左邊勾選android-support-v4

  3-6. 接下來點選你的app這裡範例是test就test-test,並在右邊下面點選Module Dependency加入,選取actionBarSherlock



  3-7. 在右邊就會出現actionBarSherlock,接著就勾選起來

  3-8. 大功告成!!



4.測試

測試前

測試後




Android Studio

這次Google I/O 2013發佈一個新的Android IDE - Android Studio!

主要是基於IntelliJ IDEA 做改寫,其中裡面最令人驚訝就是設計Layout的部份

即見即所得以及包含在任何視窗的預覽!

包含版本控制(git), 強大編輯功能

目前現在最大最大的缺點就是....介面及快捷鍵要重新學習  |||orz..

Android Studio - Download


在Google I/O 2013 也有介紹Android Studio


2013年5月15日 星期三

Arduino 利用Ethernet傳送及接收

今天要說的不算是照門只說程式,如果有什麼問題還請大家指教

ps 有任何的電子學的問題及關於電子學,我一律沒辦法回答大家(我不是很專業也怕誤人子弟)


測試環境及版本
OSX 10.8.3
Arduino 1.0.4


設備
Mega2560
Ethernet with PoE module



要注意幾個,宣告幾個變數
mac         為你設備的mac號
ip            你這台Ethernet的ip你可以自行設定(網段要一樣才收得到, ip不可跟其他設備衝突)
remote    你想要傳送的ip位置
Listen(x) 你x可以設定你想監聽的port號


EthernetSend()    -  傳送到指定位置
- Deliver():
client.print("GET /");
要設在client起始接著GET /斜線後面接你的目標網址
例如你可以設定成
client.print("GET /save.php?a=123&b=456");


EthernetListen()  -  監聽目標
當去瀏覽這個網頁就會啟動function
裡面的Request為回傳網頁資訊包含瀏覽的路徑, get/post, ....
接下的Control是針對瀏覽路徑知道要怎麼Control 設備(LED亮/滅)


github: https://github.com/jiunjiun/Arduino_Ethernet


下面為程式碼




2013年5月9日 星期四

Install Apache + PHP + MySQL use Homebrew

在原生的Mac也就是你一開始拿到Mac的時候

就已經安裝Apache, PHP,但是版本不是最新的

接著下面就是使用Homebrew來安裝


Apache
brew tap djl/homebrew-apache2 
brew install djl/apache2/apache24

接著httpd.conf
vi /usr/local/Cellar/apache24/2.4.4/conf/httpd.conf
增加下面
LoadModule php5_module    /usr/local/opt/php54/libexec/apache2/libphp5.so
AddType application/x-httpd-php .php

PHP
brew tap homebrew/dupes 
brew tap josegonzalez/homebrew-php
brew options php54
brew install php54 --homebrew-apxs

MySQL
brew install mysql


參考資料
http://sobstel.org/blog/pow-nginx-apache-ruby-php-all-through-port-80/
https://github.com/josegonzalez/homebrew-php
http://justinhileman.info/article/reinstalling-php-on-mac-os-x/

2013年5月7日 星期二

Mac Install RVM

用RVM管理Ruby version

RVM Install
curl -L https://get.rvm.io | bash -s stable --rails --autolibs=enable
rvm get stable --autolibs=enable

安裝想安裝的版本
rvm install 2.0

安裝完後可以從下面查裝的版本
rvm list rubies

安裝完後在執行的時候還是舊的版本,你還需要去指定成新的版本
rvm use 2.0.0 --default

這樣就完成了

Mac Android use Homebrew

原本Android SDK都從Google官網下載

想說Homebrew不知道能不能下載

沒想到竟然可以,真的很方便

brew install android

這樣就完成了,直接下
android


就會開啟Android SDK Manager下載需要的SDK

路徑位置在
/usr/local/Cellar/android-sdk/r21.1/


參考資料
http://blog.beyondthecorner.co.uk/2011/01/15/android-on-os-x-without-eclipse/

2013年5月6日 星期一

Homebrew

安裝到現在

到目前為止在mac安裝程式方式很多種

也因為使用太多種,因此在這裡將重新說明

從現在開始文章都將以 Homebrew 來安裝

先前的就當做沒看到吧  ㄎㄎ


http://mxcl.github.io/homebrew/


安裝方式
ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"

就安裝成功,基本上不會有太大的問題


在原生的Mac已經存在ruby, apache, php, ...等等

但你在從brew install執行都還是會指向舊的版本

接著再
printf '\n## Homebrew bin path address\nexport PATH=/usr/local/bin:$PATH' >> ~/.bash_profile

把路徑指向就會以Homebrew所下載的為主:P







2013年4月25日 星期四

LiveReload

在寫網頁的時候,時常在改一段code然後需要回去browser按個ctrl+r(F5)去重新整理畫面

來觀看改寫的內容,但現在要介紹一個好物!!!

那就是     LiveReload    !!!!

簡單來說只要安裝就可以解決上面了問題!!


可以去官網安裝  LiveReload

原則上就下一步下一步沒什麼太大問題!

接著再依序你所使用browser來安裝

下面是for chrome的擴充套件



來了來了
在Mac上需要   $300大洋

為了不想花錢

還是有別的方法!就是下面



使用方法很簡單

首先你必須先有install Ruby這邊就不介紹

接著再下
gem install guard-livereload

就安裝完成!!

接著再你的網頁目錄下
guard init livereload

就會在你的目錄下產生一個
Guardfile

產生的規則是以rails為主,可以從裡面做參考

若你沒有想特別去指定要偵測的檔案,可以用下面附檔名的方式去設定

接著你只要去修改成下面
# A sample Guardfile
# More info at https://github.com/guard/guard#readme

guard 'livereload' do
  watch(%r{.+\.(css|js|html?|php|inc|module|info)$})
end

可以再依你需要的偵測的附檔名做調整

接著再去執行他
guard

就可以執行了,接著一樣再去browser的Enable LiveReload就完成了

以上若有問題還請大家指教


參考資料
http://blog.wu-boy.com/2011/10/how-to-install-livereload/
http://wp.xdite.net/?p=3088

MacVim 切畫面及切換

在用Vim的時候,常會希望你可切畫面切左右來工作

在Vim可以切左右和上下

切上下
:split 

切左右
:vsplit 

這個時候你一定想問,我切換的畫面每次都要用滑鼠去點才能編寫

接下面是教你怎麼切換你所切的畫面

只要按
ctrl+w w
ctrl+w <方向鍵>

切回去的話
ctrl+w shift+w


參考資料
http://www.openfoundry.org/tw/tech-column/2383-vim--buffers-and-windows
http://hi.baidu.com/fox000002/item/0e962353f8e71f958c12edff
http://hi.baidu.com/southhill/item/724c9bcf6330f413b77a246a

Mac Mysql

在Mac install mysql有很多方法

可以用port, brew或是直接從官網下載

在這裡是用 brew來下載
brew install mysql

之前有用過port版本更新就沒有那麼快

再來就是要啟動需要打的指令比較多也比較繁瑣

啟動mysql方法
mysql.server start



2013年4月19日 星期五

MacVim plugin nerdcommenter

這是一個可以在程式碼內註解的plugin

前陣子還在nerdcommenter思考這要怎麼使用,看了資料還是不知道怎麼做

後來問了學長才知道



如果現在要註解第三行到第五行

那麼需要將你的游標先在第三行接者需要註解到第五行總共有2行

這個時候只要直接在vim上key
2,cc

就可以完成註解

如果要取消註解就是
2,cu

教學完畢!!

2013年4月18日 星期四

解除Mac Retina封印

在Mac Retina的狀態下

雖然官方說在13/15吋有2560*1600/2880*1800的解析度

但實際上在系統只能讓你調用到1680 x 1050/1920 x 1200

現在來打破限界

首先先到這裡下載

接著在上面Key上欲轉換的解析度
XXX YYY(用空白代替*)

就可以轉換成功


參考資料:

2013年4月16日 星期二

MacVim plugin (持續更新中...)

在MacVim是一個非常強大的編輯器

他強大之處就是可以plugin套件,經過學長推薦有幾該個還不錯放在上面


ctrlp.vim
https://github.com/kien/ctrlp.vim
https://blog.othree.net/log/2012/11/10/ctrlpvim/


ZenCoding.vim
https://github.com/mattn/zencoding-vim
http://nootn.com/blog/Tool/23/
http://www.zfanw.com/blog/zencoding-vim-tutorial-chinese.html


nerdcommenter
可對程式碼做註解
使用方法可以參考這裡


vim-powerline
可以顯示漂亮的介面
https://github.com/Lokaltog/vim-powerline


snipmate (這個大大的推薦)
這個可以針對不同的附檔名,使用tab鍵快速產生code
http://www.vim.org/scripts/script.php?script_id=2540


vim-css-color
可以在css下對應color顯示
https://github.com/ap/vim-css-color


surround
方便的編輯器,可以去做修改刪除的功能
https://github.com/tpope/vim-surround


NERDtree
檔案編輯器
http://www.vim.org/scripts/script.php?script_id=1658


SuperTab
只要按Tab就可以呼叫最近使用的變數
http://www.vim.org/scripts/script.php?script_id=1643


PIV
這個對於php開發者很重要,不僅可以縮程式碼最重要的是IDE只要
在-> or :: 輸入

<C-X><C-O>

就可以幫你找對應的函式



參考連結及說明:
http://blog.eddie.com.tw/2012/06/01/screencast-3-vim-plugins/







iTerm2

使用了幾天Mac 常常使用command line(我的好朋友阿!)

卻沒有快捷鍵可以馬上呼叫,最近的還只能呼叫到應用程式,還要經過點選等等等等步驟...

實在讓人有點不便

經過學長的推薦, iTerm2實在是太方便而且又可以馬上呼叫,真的是利器


連結在下面


關於iTerm2一些基本設定可以參考這邊

http://loukafai.blogspot.tw/2012/05/iterm2.html

Eclipse Retina

在Retina上去執行Eclipse那畫面真的還蠻不好看

搜尋了一下只要做幾個步驟就可以支援

mvim ~/{存放路徑}/eclipse/Eclipse.app/Contents/Info.plist

接著在倒數第二行加入幾行,記住不能有空白!

NSHighResolutionCapable


參考資料:
http://bbs.weiphone.com/read-htm-tid-5031366.html


Install MAMP Development stack on Mountain Lion using MacPorts

這是一篇從網路上轉載的別人寫好了MAMP(Mac, Apache, MySQL, PHP)使用MacPorts來完成

因為Mac本身就有預載Apache, PHP,不過版本可能不是最新的

前半步驟都在先更新軟體

接下來在做設定

大家可以參考下面的連結:
https://gist.github.com/TeamOneJ/4210358
http://2tbsp.com/content/install_apache_2_and_php_5_macports

在Mac上使用PageUp/Down, Home, End

在Mac上的terminal使用vim的時候

使用PageUp/Down, Home, End 不是針對vim, 而是整個terminal都跳

可以設定下面去讓他不會亂跳



打開 terminal -> Preferences -> Settings -> Keyboard
增加以下四個 Key / Action

home           \033[1~
end              \033[4~
page up       \033[5~
page down   \033[6~


接著只要搭配 fn + 上下左右鍵 就可以了


參考連結:
http://trully622.blogspot.tw/2012/01/mac-vim-pagedown-pageup-home-end.htmlterminal

2013年4月15日 星期一

Mac Ports


Mac Port

就很像BSD的port tree,都可以透過這邊去更新需要程式

參考連結:

PHP Install in Mac

在Mac都有預載php,不過版本可能會不是最新

可以參考這裡

MacVim

MacVim

Install url:https://code.google.com/p/macvim/

dotfiles

經過學長提點

他推薦我一個dotfiles

至於dotfiles我還不清楚是什麼(如果有人知道跟我說一下)

似乎是一個基礎設定,像是.vimrc, .vim, .bashrc, etc.

最明顯的狀況就是MacVim, command line 都有顏色的改變!!


在安裝之前需要先安裝 git

https://github.com/mathiasbynens/dotfiles

git clone https://github.com/mathiasbynens/dotfiles.git && cd dotfiles && source bootstrap.sh

Mac Pro Book Retina!!

這篇完全沒有任何技術或是任何說明

單純的想說

我終於加入Mac開發環境了!!

以後文章會開始慢慢轉成Mac環境下執行


哈哈...

2013年4月11日 星期四

2013年4月1日 星期一

在其他的Service讀取PreferenceActivity所設定的值

經過上次 http://jiun-blog.blogspot.tw/2013/03/preference.html

發現到如果要在其他Service同步偵測,發現在PreferenceActivity所設計的值會有錯誤或抓不到

搜尋後找到了這個方法

public class BackgroundService extends Service {
 
 SharedPreferences.OnSharedPreferenceChangeListener listener;
 
 @Override
 public IBinder onBind(Intent arg0) {
  // TODO Auto-generated method stub
  return null;
 }
 
 @Override
 public void onStart(Intent intent, int startId) {
  EnableSharedPreferences();
 }
 
 @Override
 public void onDestroy() {
  // TODO Auto-generated method stub
  super.onDestroy();
 }
 
 private void EnableSharedPreferences() {
  SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
  listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
   public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
    
   }
  };
  prefs.registerOnSharedPreferenceChangeListener(listener);
 }
}

這樣當在PreferenceActivity做了改變,這邊就會偵測到

參考資料:
http://stackoverflow.com/questions/2542938/sharedpreferences-onsharedpreferencechangelistener-not-being-called-consistently

eclipse 無法copy

在Eclipse有時會遇到無法copy的問題

雖然找不到比較直接的問題,但有解決方法可以

Window > Preferences > Java > Editor > Typing
取消勾選  Update imports

參考資料:
http://rocking5566.blogspot.tw/2013/03/eclipse.html

2013年3月31日 星期日

GPS 範圍的計算

最近在開發Android的GPS,在使用Google Map API(JS)看過可以在畫面上畫出一個範圍

就像下面這張

但今天我不是要說Google Map API的使用,至於要怎麼使用就請參考
Google Maps JavaScript API 第 3 版

從上面那張圖的座標點都是從資料庫下來的,但是如果是只要在藍色範圍的座標,就可以參考下面SQL Query

$query = "SELECT ((ACOS(SIN($lat * PI() / 180) * SIN(gps_lat * PI() / 180) + COS($lat * PI() / 180) * COS(gps_lat * PI() / 180) * COS(($lon - gps_long) * PI() / 180)) * 180 / PI()) * 60 * 1.1515 * 1.609344) AS distance, 
gps_lat, gps_long
FROM `mytable` HAVING distance<=$dist ORDER BY distance ASC"

找出你資料庫內有小於這個範圍的資料
這邊的 $lat, $lon為你所要設定的中點GPS(經瑋度),$dist為你所要找的範圍(單位:公里)

比較圖


參考資料:
http://zcentric.com/2010/03/11/calculate-distance-in-mysql-with-latitude-and-longitude/
http://www.marketingtechblog.com/calculate-distance/
http://zh.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL

2013年3月27日 星期三

OnItemClickListener 失效

最近有使用到 ListView OnItemClickListener 發現到失效的狀況

搜尋了一下可以用下面這個方法解決

在你的LinearLayout加入下面這段參數,就可以解決失效的問題
android:descendantFocusability="blocksDescendants"


    ......


2013年3月22日 星期五

FreeBSD 8.x升級9.x

其實這中間一直就想知道了,一直到現在才有機會弄,太混了(打

首先
freebsd-update fetch
freebsd-update install

系統會出現詢問"look resonable",就按Y吧...
接著下載你需要更新的版本這裡我是更新 9.1-RELEASE
freebsd-update upgrade -r 9.1-RELEASE

接著Install
freebsd-update install

重新開機!!
sync;sync;reboot

重開機後,還需要再Install,將相關組件升級到9.1版
freebsd-update install

刪除舊的或是不需要的組件(再執行一次freebsd-update install)
freebsd-update install

升級完成!!您可以查看系統的版本
uname -rs


參考連結:
http://tanet.center.kl.edu.tw/news.php?item.22

2013年3月20日 星期三

Preference

在Android App都有像是"設定"的選單,讓使用者去客制自己的選項



這個時候就可以使用Preference來設計你的選單

res/xml/setting
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
    <PreferenceCategory android:title="@string/wifi_setting" >
        <CheckBoxPreference
            android:key="@string/test1_key"
            android:defaultValue="true"
            android:title="@string/title1"
            android:summary="@string/summary1" />
   
        <CheckBoxPreference
            android:key="@string/test2_key"
            android:dependency="@string/test1_key"
            android:defaultValue="false"
            android:title="@string/title2" 
            android:summary="@string/summary2" />

        <ListPreference
            android:key="@string/test3_key"
            android:dependency="@string/test1_key"
            android:entries="@array/interval"
            android:entryValues="@array/intervalValues"
            android:defaultValue="30"
            android:title="@string/title3" 
            android:summary="@string/summary3" />
    </PreferenceCategory>
</PreferenceScreen>

我們有時候會看到當選擇了某一項開關,下面的選擇都會被關閉不可選,就是用dependency來指定
只要去指定要follow的key就可以

上面的interval,intervalValues的值就設定在arrary.xml也就是下面

res/value/array.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="wifi_update_interval">
        <item name="10">10 秒鐘</item>
        <item name="30">30 秒鐘</item>
        <item name="60">1 分鐘</item>
        <item name="300">5 分鐘</item>
    </string-array>
    <string-array name="wifi_update_intervalValues">
        <item name="10">10</item>
        <item name="30">30</item>
        <item name="60">60</item>
        <item name="300">300</item>
    </string-array>
</resources>

接著建立一個Option Class
public class option extends PreferenceActivity implements OnPreferenceChangeListener {
 
 /*** Debugging ***/
 private static final String TAG = "option";
 private static final boolean D = true;
 
 
 String test1_key, test2_key, test3_key;
 CheckBoxPreference test1, test2;
 ListPreference test3; 
 
 @Override
 @SuppressWarnings("deprecation")
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  addPreferencesFromResource(R.xml.setting);
  
  getSupportActionBar().setDisplayHomeAsUpEnabled(true);
  
  test1_key = getResources().getString(R.string.test1_key);
  test2_key = getResources().getString(R.string.test2_key);
  test3_key = getResources().getString(R.string.test3_key);
  
  test1   = (CheckBoxPreference) findPreference(test1_key);
  test2   = (CheckBoxPreference) findPreference(test2_key);
  test3   = (ListPreference) findPreference(test3_key);
  
  test1.setOnPreferenceChangeListener(this);
  test2.setOnPreferenceChangeListener(this);
  test3.setOnPreferenceChangeListener(this);
 }
 
 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
     switch (item.getItemId()) {
      case android.R.id.home:
          finish();
          return true;
      default:
          return super.onOptionsItemSelected(item);
     }
 }

 @Override
 public boolean onPreferenceChange(Preference preference, Object newValue) {
  // TODO Auto-generated method stub
  if(D) Log.e(TAG, "Change preference.key: " preference.getKey().toString());
  if(D) Log.e(TAG, "Change preference.key: " newValue.toString());
  
  if(preference.getKey().equals(test1_key)) {

  } else if(preference.getKey().equals(test2_key)) {

  } else if(preference.getKey().equals(test3_key)) {
   
  }
  return true;
 }
}

onPreferenceChange這個Listener會去Listener當值變化的時候,你可以將你的值紀錄起來,這樣大致上就完成
但這個還是有一個問題,你的系統已經紀錄你的option的變化,但你的所設定的defValue卻沒有相同
這時你還需要加入下面來讓你的defValue一樣

public class MainActivity extends Activity {
 
 /*** Debugging ***/
 private static final String TAG = "MainActivity";
 private static final boolean D = true;
  
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
 }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
     if(D) Log.e(TAG, "item.getItemId() "   item.getItemId());
     switch(item.getItemId()) {
     case R.id.menu_settings:
      startActivity(new Intent().setClass(this , option.class));
      break;
     }
        return false;
    }
        
    private void init_option() { 
     SharedPreferences pref  = PreferenceManager.getDefaultSharedPreferences(mContext);
        test1 = pref.getBoolean("test1_key", true);
        test2 = pref.getBoolean("test2_key", false);
        test3 = Integer.parseInt(pref.getString("test3_key", "30"));
    }
}

2013年1月2日 星期三

Rubular

在Ruby很常會使用到 Regular

這個網站可以針對你的需要處理的字串,透過你所寫的RegExp馬上顯示出來所截取的資料


Ruby Regular Expressions


我們從這個例子
# 抓出手機號碼 
phone = "123-456-7890"
if phone =~ /(\d{3})-(\d{3})-(\d{4})/
  ext  = $1
  city = $2
  num  = $3
end

可以抓出分別是123, 456, 7890

但在新的一版1.9可以在正規表示內加入參數
# 抓出手機號碼 
match_phone =  /(?<ext>\d{3})-(?<city>\d{3})-(?<num>\d{4})/.match(phone)
puts match_phone[:ext]
puts match_phone[:city]
puts match_phone[:num]

參考資料
ihower
http://www.igvita.com/2011/02/03/new-ruby-19-features-tips-tricks/