2009年12月1日 星期二

C語言編譯參數查詢方式

以 libcurl 為例:

libcurl的編譯參數設置參考指令: curl-config

‧需要哪些 flags 來編譯我的code?
curl-config --cflags

‧需要哪些參數options 來編譯我的code?
curl-config --libs

‧我的有SSL 支援嗎?
curl-config --feature | grep SSL

‧我的libcurl版本?
curl-config --version

2009年10月31日 星期六

Ubuntu 9.04 - Build ARM Toolchain (Cross Compiler)

環境: Ubuntu 9.04

前置作業:
  • 安裝相關開發套件

#sudo apt-get install build-essential bison flex texinfo

  • 手動更改gcc版本
    • 由於gcc存在著兼容性的問題,所以部分程式可能需要使用指定版本的gcc才能編譯通過。在編譯ARM Toolchain嘗試過程中, 我使用 gcc-4.1.0 版本才得以順利通過編譯。

    1. 先查看目前gcc版本,通常為 gcc-4.3.2 版本,若已為 gcc-4.1.0 版本即可跳過此步驟。
    2. #gcc --version
    3. 觀看系統已安裝之所有 gcc 版本,此時會發現系統已安裝 gcc-4.3.2 之版本。
    4. #ls /usr/bin/gcc* -l
    5. 利用update-alternatives工具來改變gcc鏈結,先增加 gcc-4.3.2 與 gcc-4.1.0 兩版本選項。
    6. #update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.3 40 
      #update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.1 30
    7. 切換預設 gcc 版本到 gcc-4.1.0,然後鍵入所需要的版本的相對應數字,最後再確定一次目前 gcc 版本即完成。
    8. #update-alternatives --config gcc
      #gcc --version

  • 開始進行 ARM Toolchain 安裝步驟

    1. 先設定欲安裝相關套件之版本,與安裝參數以減少命令長度
    2. #export TARGET=arm-elf
      #export PREFIX=/usr/src/esd/toolchain
      // Install location of your final toolchain (記得先建立此資料夾)
      #export PATH="$PATH:$PREFIX/bin"
      #export BINUTILS=binutils-2.19.1
      #export GCC=gcc-4.1.0
      #export NEWLIB=newlib-1.17.0
      #export GDB=gdb-6.8
      
    1. Install binutils-2.19.1
    2. #tar xfvj $BINUTILS.tar.bz2
      #mkdir build_binutils
      #cd build_binutils
      #../$BINUTILS/configure --target=$TARGET --prefix=$PREFIX --enable-interwork --enable-multilib
      #make all
      #make install
    3. Install gcc-4.1.0 (上)          先只針對 gcc 的部分編譯安裝
    4. #wget -c ftp://ftp.gnu.org/gnu/gcc/$GCC/$GCC.tar.bz2
      #tar xfvj $GCC.tar.bz2 #mkdir build_gcc
      #cd build_gcc
      #../$GCC/configure --target=$TARGET --prefix=$PREFIX --enable-interwork --enable-multilib --enable-languages=c,c++ --with-newlib --with-headers=/balabala/newlib-1.17.0/newlib/libc/include(--with-headers即指向newlib-1.17.0解壓縮後所置放的位置)
      #make all-gcc 
      #make install-gcc
    5. Install newlib-1.17.0
    6. #wget -c ftp://sources.redhat.com/pub/newlib/$NEWLIB.tar.gz
      #tar xfvz $NEWLIB.tar.gz #mkdir build_newlib
      #cd build_newlib
      #../$NEWLIB/configure --target=$TARGET --prefix=$PREFIX --enable-interwork --enable-multilib
      #make
      #make install
    7. Install gcc-4.1.0 (下)           返回原 build_gcc 目錄下,完整編譯 gcc
    8. #cd build_gcc
      #make all install
    9. Install gdb-6.8
    10. #wget -c ftp://ftp.gnu.org/gnu/gdb/$GDB.tar.bz2
      #tar xfvj $GDB.tar.bz2
      #mkdir build_gdb
      #cd build_gdb
      #../$GDB/configure --target=$TARGET --prefix=$PREFIX --enable-interwork --enable-multilib
      #make
      #make install
    11. 將ARM Toolchain路徑永久加入環境變數
    12. #vim /etc/environment
      把ARM Toolchain TARGET安裝路徑加入最後一個之前,例如下所示:
      PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/src/esd/toolchain/bin"
      存檔離開(登出後再登入即生效)
      ---  大功告成 ----

2009年8月28日 星期五

sfGuardPlugin Data-Dump & Data-Load UserPassword error solution

Please rewrite signin function from sfGuardPlugin/lib/model/plugin/PluginsfGuardUser.php as following:

(For Propel)
public function setPassword($password)
  {
    if (!$password && 0 == strlen($password))
    {
      return;
    }
/*
 * iba: if salt is set then probly the passwort is already encrpted
 * thus call setPassword without user_funx algorythm
 */
    /*--- Add Here ---*/
    $fromdump = false;
    if($this->isNew() && $this->getSalt()){
      $fromdump=true;
    }
    /*----------------*/

    if (!$salt = $this->getSalt())
    {
      $salt = md5(rand(100000, 999999).$this->getUsername());
      $this->setSalt($salt);
    }
    $algorithm = sfConfig::get('app_sf_guard_plugin_algorithm_callable', 'sha1');
    $algorithmAsStr = is_array($algorithm) ? $algorithm[0].'::'.$algorithm[1] : $algorithm;
    if (!is_callable($algorithm))
    {
      throw new sfException(sprintf('The algorithm callable "%s" is not callable.', $algorithmAsStr));
    }
    $this->setAlgorithm($algorithmAsStr);

/*
 * iba: if passwort is already encrypted dont encrypt it again.
 */
    /*--- Add Here ---*/
    if($fromdump){
      parent::setPassword($password);
    }
    /*----------------*/

    else{
      parent::setPassword(call_user_func_array($algorithm, array($salt.$password)));
    }   
    
  }

2009年8月5日 星期三

New way to loadHelper for symfony 1.2

In Action class file:

Before -
sfLoader::loadHelper("helper");

New way -
sfContext::getInstance()->getConfiguration()
->loadHelpers("helper");

2009年8月3日 星期一

Unix 系統切換開機進入文字或 X-windows 模式

Red Hat、 Fedora、Mandruke 或 Mandriv

/etc/inittab 中包括":initdefault"一行,更改"id:"和":initdefault:"之間的數字。
如果你想開機自動進入文字模式,轉為3。
如果你想開機自動進入圖像(X Window)模式,轉為5。
id:3:initdefault
所有Unix/Linux都有最少0-6七個run level,不同run level代表不同執行模式。 Red Hat等定了run level 3為文字模式,而run level 5為 X-Window圖像模式。 inittab中的initdefault控制了開始預設進入那個run level, 所以改變這個數值就可以切換開機自動進入那個模式。

Debian 或 Ubuntu

Debian或Ubuntu是利用SysVinit啟動X Display Manager,亦即是所謂的圖像模式登入畫面。
只要你安裝任何一個X-Display Manager(包括xdm、gdm、kdm和wdm),
系統開機時就會自動執行,進入圖像模式。如果你想開機自動進入文字模式,
你可以選擇移除所有X-Display Manager。
apt-get remove xdm gdm kdm wdm
或者關閉開機自動啟動任何一個 X Display Manager。

2009年8月1日 星期六

FreeBSD 7.1 安裝 phpSysinfo & phpMyAdmin


phpSysInfo:

安裝:
# cd /usr/ports/www/phpsysinfo/
# make install clean
編輯設定:
# cd /usr/local/www/phpsysInfo/
# cp config.php.new config.php
# ee config.php
修改你要的設定,例如語言、預設模板等等。
接著修改 /usr/local/etc/apache22/httpd.conf
Alias /phpsysinfo "/usr/local/www/phpsysInfo/"
<Directory "/usr/local/www/">
Options none
AllowOverride Limit
Order allow,deny
Allow from all
</Directory>
接著重開 apache 即可。

phpMyAdmin:

安裝:
# cd /usr/ports/databases/phpMyAdmin/
# make install clean
編輯設定檔:
# cd /usr/local/www/phpMyAdmin/
# cp config.sample.inc.php config.inc.php
# ee config.inc.php

在FreeBSD 7.1下,以下設定似乎可忽略 (因為我沒設定)

$cfg['Servers'][$i]['auth_type'] = 'cookie' ;
改為 $cfg['Servers'][$i]['auth_type'] = 'http' ;

接著修改 /usr/local/etc/apache22/httpd.conf
Alias /phpmyadmin "/usr/local/www/phpMyAdmin/"
<Directory "/usr/local/www/">
Options none
AllowOverride Limit
Order allow,deny
Allow from all
</Directory>
如果你前面已經有加上 <Directory "/usr/local/www/">,則不需要在加上那段。
最後重開 apache 即可。



資訊轉載自 阿駕零零壹 感謝 <(__)>

2009年7月29日 星期三

LAMP in fedora 10 需注意的兩三事

利用網路上資源安裝完成LAMP 環境後,

我遇到兩個問題:

Q1. 網路設定一直無法更動,更改後會變回預設模式(DHCP mode).

A1. 移除 fedora 10 所安裝的套件 "Network Manager".


Q2. 網頁內容只有本機端可見,外部網路無法連入.

A2. 關閉 iptables & SELinux service.

2009年7月22日 星期三

symfony "schema.yml" file

`schema.yml` 文件包含了所有的資料庫表格的規劃描述。每個都通過如下訊息描述:

* `type`: 資料類型 (`boolean`, `tinyint`, `smallint`, `integer`, `bigint`, `double`,
`float`, `real`, `decimal`, `char`, `varchar(size)`, `longvarchar`,
`date`, `time`, `timestamp`, `blob`, `clob`)

* `required`: 設為 `true` 用來表示此欄位內容不得為空白

* `index`: 設為 `true` 為該表格創建索引鍵,或者設置 `unique` 在該表格上創建唯一索引鍵。

對於設置資料內容為 `~` (`id`, `created_at`, 和 `updated_at`) 的資料,symfony 會探測最合適的
配置方式(`id`是作為主鍵,`created_at` 和 `updated_at`是時間戳記)

**NOTE**
`onDelete`: 屬性定義了外鍵的`ON DELETE`行為。Propel 只是 `CASCADE`, `SETNULL`,
`RESTRICT` 等幾種。
例如,删除一條 `job` 紀錄後,`jobeet_job_affiliate` 中所有相關
紀錄也會自動通過數據庫删除。如果底層的數據庫引擎不支持該功能,Propel可以做到。

2009年7月21日 星期二

Backend Admin FileUpload for symfony 1.2

This approach is to provide a path option to sfValidatorFile...
--------------------------------------------------------------
// lib/form/StudentForm.class.php
class StudentForm extends BaseStudentForm
{
    public function configure()
    {
        $this->widgetSchema['photo'] = new sfWidgetFormInputFile();
        $this->validatorSchema['photo'] = new sfValidatorFile(array(
        'path' => sfConfig::get('sf_web_dir').'/uploads/students',
        ));
    }
}
--------------------------------------------------------------
And write a generatePhotoFilename() method on Student (assuming "Photo" is the phpName for the field name "photo")
--------------------------------------------------------------

// lib/model/Student.php
class Student extends BaseStudent
{
    public function generatePhotoFilename(sfValidatedFile $file)
    {
        return $file->getOriginalName();
    }
}

--------------------------------------------------------------

This way is probably the preferred approach as it makes for a thinner controller.