Doctrine2 安裝教學

**本文假設php.exe已經安裝完成,並新增到windows的環境變數中。

  1. 首先下載及安裝 Composer-Setup.exe, 這個程式將會幫忙我們下載各類型的程式庫,包括我們即將使用的doctrine.
    網址為: http://getcomposer.org/doc/00-intro.md
  2. 安裝後,我們建立新專案的資料夾,例如new_project,然後在新專案的root目錄裏(即根目錄),新增檔案composer.json,然後於檔案中輸入以下json code:
    {
        "require": {
            "doctrine/orm": "2.*",
            "symfony/yaml": "2.*"
        },
        "autoload": {
            "psr-0": {"": "src/"}
        }
    }

    這個檔案是告訴Composer我們即將安裝什麼程式庫到我們的新專案。
  3. 然後我們打開command mode,前往我們專案的root目錄,並輸入以下指令:
    composer install

    如無意外,你將會看到正在下載的畫面,等待片刻程式庫將會自動安裝到我們的專案目錄裏。
  4. 另外,我們需要為doctrine準備以下的資料夾,架構如下:
    new_project
    |-- composer.json
    |-- config
    |   |-- xml
    |   `-- yaml
    `-- src
  5. 然後,讓我們於root目錄中新增一個檔案名為bootstrap.php,並加入以下代碼:
    <?php
    // bootstrap.php
    use Doctrine\ORM\Tools\Setup;
    use Doctrine\ORM\EntityManager;

    require_once "vendor/autoload.php";

    // Create a simple "default" Doctrine ORM configuration for Annotations
    $isDevMode = true;
    //$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/entities"), $isDevMode);
    // or if you prefer yaml or XML
    //$config = Setup::createXMLMetadataConfiguration(array(__DIR__."/config/xml"), $isDevMode);
    $config = Setup::createYAMLMetadataConfiguration(array(__DIR__."/config/yaml"), $isDevMode);

    // database configuration parameters
    //$conn = array(
    //    'driver' => 'pdo_sqlite',
    //    'path' => __DIR__ . '/db.sqlite',
    //);

    $conn = array(
        'driver'   => 'pdo_mysql',
        'host'     => '127.0.0.1',
        'dbname'   => 'test',
        'user'     => 'root',
        'password' => ''
    );

    // obtaining the entity manager
    $entityManager = EntityManager::create($conn, $config);


    使用什麼資料格式進行orm請自行決定,以上我使用了yaml.
  6. 於root目錄中再新增一個檔案名為cli-config.php,並加入以下代碼:
    <?php
    // cli-config.php
    require_once "bootstrap.php";

    $helperSet = new \Symfony\Component\Console\Helper\HelperSet(array(
        'em' => new \Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper($entityManager)
    ));
  7. 初步設定已經完成,接下來讓我們建立資料表架構,我們使用yaml建立一個資料表架構,代碼如下:
    # config/yaml/Product.dcm.yml
    Product:
      type: entity
      table: products
      id:
        id:
          type: integer
          generator:
            strategy: AUTO
      fields:
        name:
          type: string
  8. 然後我們再使用以下指令,讓doctrine為我們建立mapper class:
    vendor\bin\doctrine orm:generate-entities config/yaml

    建立完成後,請將建立的mapper class於config/yaml中移到 root/src.
  9. 再來讓我們在資料庫中建立資料表:
    vendor\bin\doctrine orm:schema-tool:create
  10. 現在就可以使用doctrine來操作資料表了,以下為簡單例子:
    <?php
    // create_product.php
    require_once "bootstrap.php";

    $newProductName = $argv[1];

    $product = new Product();
    $product->setName($newProductName);

    $entityManager->persist($product);
    $entityManager->flush();

    echo "Created Product with ID " . $product->getId() . "\n";


    **執行指令測試輸入資料到資料表:
    php create_product.php ORM

    <?php
    // list_products.php
    $productRepository = $entityManager->getRepository('Product');
    $products = $productRepository->findAll();

    foreach ($products as $product) {
        echo sprintf("-%s\n", $product->getName());
    }


    <?php
    // show_product.php
    $id = $argv[1];
    $product = $entityManager->find('Product', $id);

    echo sprintf("-%s\n", $product->getName());
  11. 以下指令可以依現時的mapper class格式轉換成為xml格式
    vendor\bin\doctrine orm:convert-mapping xml /path/to/mapping-path-converted-to-xml


    doctrine2 已經安裝完成,以後可以輕鬆地透過orm操作資料庫了。

2013年。。。

由小時候開始,我就有自已的夢想列表,一個又一個天馬行空的、不切實際的夢想。這個夢想列表有推動人生的作用,像海中的燈塔。漸漸人大了,夢想列表的夢想也變得實際,不會將夢想設得太遙遠,最起碼能在短期內實踐。

人生太短,如果我們沒有把握時間,實踐自己的夢想,原地踏步過著平凡的生活,最終時間會將青春及夢想一起帶走。

2013年,又迎來新一年的開始,每年這個時候我也會為接下來的一整年計劃要做的事,順便更新自已的夢想列表。回望2012年為自已設下的目標完成進度雖說不是全部完成,但總算完成過半。

人越大,感覺時間過得越快,每天也想把時間留住,最後也無奈地送走了2012年。實踐夢想需要付出一定的代價,值不值得就視乎自已的判斷,不顧一切去實踐夢想還是原地踏步過著安全的生活?反正人生本來就一無所有,有什麼好怕?放下一切去做自已喜歡的事,實踐自已的夢想。。。

自訂UITableViewCell風格

  1. 於project中建立一個新file,選擇Cocoa Touch後再選擇Object-C class.
  2. 於Class中輸入自訂的Cell名稱,例如MovieTableViewCell,於Subclass of中輸入UITableViewCell.
  3. 我們需要為自訂的UITableViewCell增加一個UIView,讓我們可以自訂Cell的風格。建立一個新file,選擇User Interface後再選擇View.
  4. 建立View後,xcode為我們預設的並不是正確的UITableViewCell,所以我們手動將預設的View刪除,再於Ojbect Library中拉出Table View Cell。
  5. 現在我們可以自由地在Table View Cell中設計風格,例如加入圖片及文字等等。
  6. 將我們自訂的UITableViewCell加入到UITableViewController
    //設定Section數量
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
        return 1;
    }
    //設定Section總行數
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return 5;
    }
    //設定每行的Cell
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier = @"Cell";
        MovieTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            NSArray* views = [[NSBundle mainBundle] loadNibNamed:@"MovieTableViewCell" owner:nil options:nil];
            cell=[views objectAtIndex:0];
           
            cell.title.text=@"this is title";
            NSURL *imageURL=[NSURL URLWithString:@"http://www.yoursite.com/hello.png"];
            NSData *imageData=[NSData dataWithContentsOfURL:imageURL];
            cell.img.image=[UIImage imageWithData:imageData];
        }
        return cell;
    }
    //為每行的Cell設定高度
    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return 77;
    }

  7. 取消預設的UITableViewCell風格,於UITableViewController中的viewDidLoad加入:
    [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
  8. 如果像這個例子,每個Cell都會透過網絡下載不同的圖片顯示,那麼當使用者進行Scroll時,將會出現累格的情況,這時我們只需要在MovieTableViewCell.m中加入以下語法,即可解決這個問題:
    -(NSString *)reuseIdentifier
    {
        return @"Cell";
    }

    原因是以下語法將我們自訂的UITableViewCell與dequeueReusableCellWithIdentifier進行了連結,令app不需要浪費資源每次進行提取。

為UIWebView加上Loading

在app中使用in app browser並不會自動顯示下載進度,當網站尚未下載完成時,很多時候會出現白屏,這樣很容易令用戶出現錯覺以為app當掉。以下有個簡單的方式加入下載中的圖示,讓用戶知道我們的app還在工作中。

  1. 在Object Library中將UIWebView及Activity Indicator View拉到ViewController中,並將這兩個Object連到property:
    //interface
    @property (nonatomic, retain) IBOutlet UIWebView *webview;
    @property (nonatomic, retain) IBOutlet UIActivityIndicatorView *activityIndicator;

    //implementation
    @synthesize webview,activityIndicator;

  2. 選擇Activity Indicator View,在Attributes inspector中點選Hides When Stopped 這個選項。
  3. 然後在UIWebView上點擊滑鼠右鍵,將delegate連結到本身的ViewController。
  4. 在implementation中加入兩個delegate的function:
    -(void)webViewDidStartLoad:(UIWebView *)webView
    {
        [activityIndicator startAnimating];
    }

    -(void)webViewDidFinishLoad:(UIWebView *)webView
    {
        [activityIndicator stopAnimating];
    }
     
這樣完成一個簡單的Loading效果。

得到金錢,卻失去了財富

我們努力地工作、投資、創業,為的是賺取更多金錢。我們都相信有更多的金錢,就可以改善自已的生活,滿足自已的慾望,從而得到快樂及幸福。

可是當我們將所有時間都花在為金錢奮鬥時,其實我們失去的可能更多。。。因為忙碌而沒有時間陪伴家人、朋友,沒有好好享受生活,最後即使得到金錢,但回頭看才驚覺失去的其實更多,時間已經無法再回頭。

我們要懂得知足,當擁有一個幸福的家庭,過著快樂的生活其實已經足夠。為了滿足更多的慾望,不斷地為金錢而苦惱,投資失敗導致負債而煩惱、一整天埋頭苦幹導致與家人的距離拉遠,最後失去了原本幸福快樂的生活,這代價實在太沉重。

金錢並不是我們的財富,我們的財富是我們的親情、友情、愛情、知識、時間。。。如果為了獲得更多金錢最後令我們失去了財富,根本不值得,我們的財富是金錢無法購買的。

如果現在的生活過得幸福快樂沒有煩惱,請珍惜。。。

resignFirstResponder 關閉鍵盤

按下return鍵將鍵盤關閉
  1. 建立一個IBAction,將目標從first responder的狀態解除。
    -(IBAction)textFieldReture:(id)sender
    {
        [sender resignFirstResponder];
    }

  2. 然後將這個IBAction連結到textField的Did End On Exit。當在這個textField輸入完成後,按下鍵盤的return就可以關閉鍵盤。
按下背景關閉鍵盤
  1. 建立IBAction,將所有textField都執行resignFirstResponder
    -(IBAction)closeKeyboard:(id)sender
    {
        [fieldone resignFirstResponder];
        [fieldtwo resignFirstResponder];
    }

  2. 點擊背景的View,將View的class由UIView轉變成UIControl,那麼View就可以傳送events。
  3. 輸變class後,再將View的TouchDown連結到IBAction。

Ben Franklin 的十三項「美德」

Ben Franklin 在 20 歲時就給自己立下了這些人生哲學,然後一輩子不斷的實踐它們。
  1. 節制,不囫圇吞棗,不狂飲
  2. 沉默,發言一定要能夠為對方或自己創造價值
  3. 秩序,生活中的所有事物都要有它們自己的位置,所有業務都要有它們自己的時間
  4. 意志,說到的就要做到,做到跟你說到的一樣好
  5. 節儉,花費一定要能夠為別人或自己帶來價值
  6. 產出,時間跟精力必花在有用的事物上面
  7. 誠懇,不用詭計,用純粹而平等的角度思考,如果要發言,就照著你的思想說
  8. 公平,不冤枉人,應得的就要取
  9. 中道,避免極端,不要落井下石
  10. 整潔,絕不容忍身上、衣服與家中的髒亂
  11. 平靜,不被世俗所擾,也不為無法改變的事情所困
  12. 潔身,性愛是健康與生育的,不是發洩或是報復的管道
  13. 謙遜,像耶穌或與蘇格拉底一般