2010-01-22

【程式】ZF : Zend_Db_Table_Select - Sub Query

0 comments

一直不想寫很複雜的SQL,但最終還是會遇到~~唉~~

這次的需求就是要從 A Table 中取得 ID。

再從 B Table 中,依 A.ID 與 B.AID 做對應,查出資料。

這部份就用到 Sub Query

附上我的程式範列:

# 程式在 A Model 
# 先從 A Model 查出需要的 ID
$tbSelect1 = $this->getTable()->select()
        ->from($this->getTable(),
            array('COUNT(*) AS CNT', 'AID'))
        ->order('CNT DESC')
        ->group('AID')
        ;

# 再跟 B Table 做 Join
$tbSelect2 = $this->getTable()->select()
        ->setIntegrityCheck(false)
        ->from(array('T' => $tbSelect1),
            array('T.AID')
            )
        ->where("T.CNT > 10")
        ->joinLeft('B',
            'T.AID = B.AID',
            array('B.TITLE', 'B.NAME'))
        ;

$res = $this->getTable()->fetchAll($tbSelect2)->toArray();

上面這程式最後產生出來的 SQL 為

SELECT "T"."AID", "B"."TITLE", "B"."NAME" FROM (
        SELECT COUNT(*) AS "CNT", "A"."MEDIA_ID"
            FROM "A" GROUP BY "AID" ORDER BY "CNT" DESC
    ) "T"
LEFT JOIN "B" ON T.ID = B.AID

 

然後還有另一種方式,是使用 IN 的方式。

# 程式在 A Model 
# 先從 A Model 查出需要的 ID
$tbSelect1 = $this->getTable()->select()
        ->from($this->getTable(),
            array( 'AID'))
        ->group('AID')
        ;

# 利用 IN 取得所需資料
$tbSelect2 = $this->getTable()->select()
        ->setIntegrityCheck(false)
        ->from('B'
            ,array('B.TITLE', 'B.NAME')
            )
        ->where(new Zend_Db_Expr("B.AID IN (". $tbSelect1." )"))
        ;

上面這段程式產生的 SQL 為

SELECT "B"."TITLE", "B"."NAME"
        FROM "B"
        WHERE (B.AID IN (
                SELECT "A"."MEDIA_ID" FROM "A" GROUP BY "AID"
        ))

就效能來看,目前好像是 第一種 Left Join 比較好。

但因為資料量少,也還沒辦法確定。待查~~

2010-01-17

【軟體】Ubuntu : XBMC - 中文無法顯示 !!

0 comments

一開始灌好 XBMC 後,發現中文都變成方格了……

解決方式,就是將裡面的字型,換成有支援繁體中文的字型。

首先將你準備好有支援繁體中文的字型 Copy 到 /usr/share/xbmc/media/Fonts 下

接著將 /usr/share/xbmc/media/Fonts下的 arial.ttf 備份一下以防萬一,

然後將你剛 Copy 到 /usr/share/xbmc/media/Fonts下的字型,更名為 arial.ttf

現在事前的準備就搞定了。

接著開啟 XBMC > System

接著選擇 Apperance

SKIN > Fonts ,會看到 Fonts 設定為 Default

現在將 Skin > Fonts > Default 改成 Arial

改好後,再看,中文已經可以正常的顯示了喔。耶~~

搞定~

如果要將整個介面都換成中文的話。

就在 International > Language ,會看到設定為 English (US) ,如下圖:

將 English 改成 Chinese ( Traditional )

就全都變成中文了。看起來還不錯吧。

 

中文設定完成。

【軟體】Ubuntu : XBMC - Media Center

0 comments

灌了 XBMC 這套軟體後,就感覺多了一個家庭劇的感覺。

網站:XBMC

如果是 Ubuntu 8.04 ,可以參考 :
Installing Xbox Media Center (XBMC) On Ubuntu 8.04

目前 Ubuntu 9.10 要用另一種外的方式來安裝。可參考:
HOW-TO install XBMC for Linux on Ubuntu, a Step-by-Step Guide

Installing XBMC Ubuntu 9.10 Karmic or higher

If you are using Ubuntu 9.10 or higher, you have the option of a more streamlined install. Load the terminal window and issue the following (The $ is a standard substitute for your terminal prompt):

     $ sudo add-apt-repository ppa:team-xbmc
     $ sudo apt-get update
     $ sudo apt-get install xbmc

安裝完後,預設的啟動就是全螢幕。下面加上一些截圖:







畫面看起來真不錯,買一台EEE PC,放在客廳,接著52吋大螢幕,這樣就超棒了啦!!

上次我看到我朋友使用 Wii 的搖桿來操作 XBMC,真方便。

非常棒的一套軟體,還可以換 SKIN ,這套軟體還支援眾多的OS,所以有興趣的可以裝來玩玩。

 

操作方式:

參考資料:

 

 

2010-01-12

【系統】Ubuntu : Custom Application Launcher

0 comments

有些程式因為不是用 Deb 安裝的,都在要 Terminal 下指令才可以執行,

還真麻煩。這時候就可以將要執行的指令,利用 Add to Panel 裡的

Custom Application Launcher 來放到上方的工具列中 ( 就很像 Windows 中下面的那條 )。

現在就來個 Sample ,我要將 Oracle SQL Developer 加到上方的工具列中。

首先在工具列上按右鍵,在選單中選擇 Add to Panel

然後會出現下面的畫面,選擇 Custom Application Launcher

在 Name 輸入要提示的 Title ,然後 Command 就是你在 Terminal 中下的指令了。

如果想改變圖示,就按上圖中左邊的 Icon,就會出現下圖讓你選擇圖示

選擇好後,圖示就變了。

然後你就會看到工具列中,最右邊會出現我們剛增加的 Oracle SQL Developer 的 Launch Icon。

點了就可以執行了。

 

以上~Over~

【軟體】Ubuntu : Oracle SQL Developer

0 comments

環境 :

  • Ubuntu 9.04
  • sun-java6-jre

前陣子 子翔 改用了 Oracle SQL Developer 來連 Oracle 資料庫,

畫面看起來不錯,我之前是使用 【軟體】DbVisualizer : 可以管理各種資料庫的好工具

但他不能直接修改資料,我覺的挺麻煩的 ( 應該是我不會用 )

所以今天就來裝了一下 Oracle SQL Developer。

首先到 Oracle 的網站下載,要下載前要註冊成會員,超麻煩的。

我直接下載 Oracle SQL Developer for 32-bit WIndows ( This zip does not include a JDK )

如下圖:

為什麼是下載 Windows 的哩,因為解開後,你可以看到下圖中,

他一樣有 sqldeveloper.sh 這個檔案。

所以就直接打開 Terminal 執行 sh sqldeveloper.sh。

我安裝的是 sun-java6-jre,他執行的時候說找不到 /bin/java,然後叫我指定路徑給他,

所以我查了一下 java 在那裡 ( whereis java ),發現是在 /usr/bin/java,所以我就輸入 /usr 後按 Enter。

PS.上面這個畫面當初沒抓到~~就一直沒抓到了

接著他說 Error: Java home /usr/bin/java is not a J2SE SDK…… Dammit!!

可以他下面又說我可以在 /path-to-sqldeveloper/sqldeveloper/bin/sqldeveloper.conf

中加上 SetSkipJ2SDKCheck true 來跳過檢查。

所以就來改一下吧 。 vi ......../bin/sqldeveloper.conf

將 SetSkipJ2SDKCheck true 加在最下面後,存檔離開。

再次執行 sh sqldeveloper.sh,終於~~出來了~~耶~~

建立資料庫連線畫面

連線成功

某資料表的 Data 畫面

 

才剛灌好,所以也還沒深入研究,不過感覺應該是不錯啦。

PS.

可以再參考 【系統】Ubuntu : Custom Application Launcher

將執行 Oracle SQL Developer 的指令直接加到上方工具列中,

這樣就可以很簡單的啟動 Oracle SQL Developer了。

以上~~

2010-01-11

【系統】Linux : BIG-5 與 UTF-8 檔案轉換

0 comments

因為Big-5的檔案,看都會有亂碼,

所以就可以用iconv來將Big-5格式的檔案,

直接轉成Utf-8的格式。

Big-5 To Utf-8

  • iconv -f big5 -t utf-8 big5.txt -o utf8.txt

Utf-8 To Big-5

  • iconv -f utf-8 -t big5 utf8.txt -o big5.txt

【系統】PHP - Fatal error: Allowed memory size of xxx bytes exhausted

0 comments

上禮拜程式執行時,居然出現這樣的錯誤訊息。

字面上看起來應該就是 Memory 的問題了。

所以解決的方法就是到 php.ini 將 memory_limit 加大。

# vi /php-etc-path/php.ini

將 memory_limit 改成

memory_limit = 128M

但數字是看各程式的需求。

另外也可以直接在程式中設定,但記得要放在整個程式的前面。

ini_set("memory_limit","128M");
?>

PS. 另外還有其他的設定
  ini_set("max_execution_time",300000);
  ini_set("max_input_time",600000);

補充說明 memory_limit : ( PHP Configuration )


memory_limit

The Memory section of the Official Requirements part of this document provides some sample values. After you consult the memory table you may decide on 12M as the correct value. You would then edit your php.ini with this value.

memory_limit = 12M

Trial and error may be required to find the right value depending on the limitations of your phpWebSite installation environment. As noted in the memory table the number of modules that you Boost with the core phpWebSite system will greatly affect how this parameter should be set. If the value in the memory_limit parameter is set too low, then you will receive fatal runtime error messages

Fatal error: Allowed memory size of m bytes exhausted (tried to allocate e bytes) in Unknown on line n

* where m is the the memory limit the was exhausted.
* where e is the number of bytes that the memory limit was exceed by.
* where n is the line number in the phpWebSite system code where the php memory limit setting was exhausted.

以上~

2010-01-06

【系統】SUSE : PXE Server

0 comments

首先說明,本文內容九成九是從 ( Garlic ) 貼過來的,

我只是記錄一下幹過這件事~~然後再加上一些我在實作時的記錄。

好~~內文正式開始:


PXE Server ~~ 搞起來的話,要安裝新的 Server 就不再是費時的工作了。

這個是 Garlic 教的,主要都是照Garlic的步驟,但~~雖然裝起來了,

還是不太清楚是怎麼一回事…。

反正就先記錄一下吧。

大概的觀念就是 Client 開機時透過網路 DHCP 取得 IP ,

然後 TFTP -> PXE ,選擇安裝項目,結束。

 

首先 PXE Server 要安裝 DHCP 及 TFTP 還有 NFS

# zypper in dhcp
# zypper in dhcp-server
# zypper in tftp
# zypper in nfs-utils

接著設定開機就啟動

# chkconfig nfsserver 35
# chkconfig dhcpd 35

然後因為 PXE Server 主要是拿來安裝用的,

所以一定要有很多的安裝光碟的 ISO 檔。

現在就來將這些 ISO 檔設定成開機就自動 Mount 。

# vi /etc/fstab
/home/PXE/linux/ISO/SLES-11-DVD-x86_64-GM-DVD1.iso /home/PXE/linux/SLES/SLES11_1 iso9660 defaults,loop,ro 0 0
/home/PXE/linux/ISO/SLE-11-SDK-DVD-x86_64-GM-Media1.iso /home/PXE/linux/SLES/SLES11_SDK_1 iso9660 defaults,loop,ro 0 0
/home/PXE/linux/ISO/SLE-11-SDK-DVD-x86_64-GM-Media2.iso /home/PXE/linux/SLES/SLES11_SDK_2 iso9660 defaults,loop,ro 0 0

(記得 mount 的目錄要先建好,然後下面內容放在檔案最後面比較好)


有了上面這些 ISO ,就要再設定 NFS,這樣子Client 在安裝時才能掛載。

# vi /etc/exports
/home/PXE/linux 10.0.0.0/8(ro,no_root_squash,async)
/home/PXE/linux/SLES/SLES11 10.0.0.0/8(ro,no_root_squash,async)
/home/PXE/linux/SLES/SLES11_SDK_1 10.0.0.0/8(ro,no_root_squash,async)
/home/PXE/linux/SLES/SLES11_SDK_2 10.0.0.0/8(ro,no_root_squash,async)

接著來設定 DHCP Server

# vi /etc/dhcpd.conf

其中 server-name, next-server 我是指到 tftp server 的 ip 去, filename 那個也是和 pxe 有關的設定
( By Garlic )

option domain-name "chingwei.net";
option domain-name-servers 10.2.17.104;
default-lease-time 3600;
max-lease-time 72000;
ddns-update-style none; ddns-updates off;
log-facility local7;
subnet 10.0.0.0 netmask 255.0.0.0 {
        option routers                  10.2.255.254;
        option subnet-mask              255.255.0.0;
        range dynamic-bootp 10.10.1.100 10.10.1.199;
        server-name "10.10.1.1";
        next-server 10.10.1.1;
        filename "pxelinux.0";
}
# vi /etc/sysconfig/dhcpd

調整以下這行 (看你想要讓 eth0, eth1, ..... 來取得 ip)

DHCPD_INTERFACE="ANY" # 設成 ANY 就是都可以

( By Garlic )


然後是 TFTP Server

# vi /etc/xinetd.d/tftp   (把 disable 從 yes 改成 no)
# mkdir /tftpbook
# /etc/init.d/xinetd restart

接著就是 PXE Server 的設定了

# cp /usr/share/syslinux/pxelinux.0 /tftpboot
# mkdir /tftpboot/pxelinux.cfg
# vi /tftpboot/pxelinux.cfg/default
default harddisk
 # hard disk
 label harddisk
   localboot 0x80
 # SLES11
 label sles11
   kernel install-linux/sles11/kernel
   append initrd=install-linux/sles11/initrd ramdisk_size=65536 
              install=nfs://10.10.1.1/home/linux/SLES11_1 
              autoyast=nfs://10.10.1.1/home/linux/autoyast/esxi_sles11_s.xml 
              textmode=1
 # rescue
 label rescue
   kernel linux
   append initrd=initrd splash=silent rescue=1 showopts
# mediacheck
label mediachk
  kernel linux
  append initrd=initrd splash=silent mediacheck=1 showopts
# bios test
label firmware
  kernel linux
  append initrd=biostest,initrd splash=silent install=exec:/bin/run_biostest showopts
# memory test
label memtest
  kernel memtest
implicit 1
gfxboot bootlogo
display message
prompt 1
timeout 600
# vi /tftpboot/message
           Welcome to SUSE Linux Enterprise Server 11!
0fTo start the installation enter 'linux' and press .07
Available boot options:
  harddisk  - Boot from Harddisk (this is default)
  sles11    - SuSE Linux Enterprise Server
  nolapic   - Installation - Local APIC Disabled
  failsafe  - Installation - Safe Settings
  rescue    - Rescue System
  firmware  - Firmware Test
  memtest   - Memory Test
'noacpi', 'nolapic', or 'failsafe' may be necessary on some tricky hardware.
Have a lot of fun...
# mkdir -p /tftpboot/install-linux/sles11

利用 mount -o loop sles11_disk1.iso /mnt, 把 mnt/boot/x86_64/loader 下面的 linux, initrd copy 到 /tftpboot/install-linux/sles11 下面的 kernel, initrd

接下來找到同網段的 server, 用網路開機, dhcp 起來後, 會看到一個要安裝什麼的選單 (就是剛才編輯的那個 message file), 打 sles11 後, 就會利用剛才寫在 default 檔案裏面的 boot option 去開機, 因為裏面寫的是 nfs install + autoyast, 所以就沒我們的事了, 過 20 分鐘再回來看, 應該就全部裝完了

以上內容 9成9 ( By Garlic ),我只是記錄一下幹過這件事~~


補充:

在 Client 可以下 showmount -e 10.10.1.1
看10.10.1.1 上有那些可以mount。

然後要Mount 就執行:
mount 10.10.1.1:/home/SLES11 /tmp/a

若要系統於開機時自動掛載 nfs 的檔案系統,可於 Client 端的 /etc/fstab 做如下設定:

# vi /etc/fstab
10.10.1.1:/home/sles11   /mnt/nfs nfs defaults 0 0 

2010-01-05

【程式】ZF : Zend_Paginator 應用

0 comments

之前光是要產生資料列表,還有分頁,都很麻煩。

要先查出這頁要顯示的資料,然後還要計算所有的資料筆數

才能計算出總頁數,進而產生出 分頁 Bar。

現在有了 Zend_Paginator 就超方便的了,

簡簡單單就可以把所有事情搞定。

現在來個 Sample 吧。可以參考 Chapter 39. Zend_Paginator

首先在 application/Bootstrap.php,我加了一個 _initRouter

主要用來將某些 Request ,導到對應的 Controller。

// application/Bootstrap.php

/**
 * 設定 routing rules
 * @author chingwei
 */
protected function _initRouter() {
    $front = Zend_Controller_Front::getInstance();
    $router = $front->getRouter();
    $router->addRoute('media_user',
        new Zend_Controller_Router_Route_Regex(
            '_user/([\w\-\.]+)\*{0,1}(\d*)\/{0,1}$',
            array('controller' => 'ching', 'action' => 'user'),
            array(1 => 'viewId', 2 => 'page'),
            '_user/%s*%d'
        )
    );
}

接著在 Controller 裡將所有的資料產生出來,然後交給 Zend_Paginator

// application/modules/default/controllers/ChingController.php

$allMedia = $mediaModel->getMediaBySn($sn);
$paginator = Zend_Paginator::factory($allMedia);
$paginator->setCurrentPageNumber($page);
$paginator->setItemCountPerPage(3);
$this->view->paginator = $paginator;

然後在 View 中,下面中前面的程式碼就是產生最上面那張圖中的三個項目。

然後後面的Code 是指定要用那個樣版來產生分頁 Bar

// application/modules/default/views/ching/test.phtml

<? if (count($this->paginator)): ?>
<ul>
<? foreach ($this->paginator as $item): ?>
  <li><?= $item['TITLE']; ?></li>
<? endforeach; ?>
</ul>
<? endif; ?>
<?= $this->paginationControl($this->paginator,
                        'Sliding',
                        '/ching/_pagination.phtml'); ?>

最後面這個就是分頁樣版了

// application/modules/default/views/ching/_pagination.phtml

<? if ($this->pageCount): ?>
<div class="paginationControl">
<!-- Previous page link -->
<? if (isset($this->previous)): ?>
  <a href="<?= $this->url(array('page' => $this->previous)); ?>">
    < Previous
  </a> |
<? else: ?>
  <span class="disabled">< Previous</span> |
<? endif; ?>
<!-- Numbered page links -->
<? foreach ($this->pagesInRange as $page): ?>
  <? if ($page != $this->current): ?>
    <a href="<?= $this->url(array('page' => $page)); ?>">
        <?= $page; ?>
    </a> |
  <? else: ?>
    <?= $page; ?> |
  <? endif; ?>
<? endforeach; ?>
<!-- Next page link -->
<? if (isset($this->next)): ?>
  <a href="<?= $this->url(array('page' => $this->next)); ?>">
    Next >
  </a>
<? else: ?>
  <span class="disabled">Next ></span>
<? endif; ?>
</div>
<? endif; ?>

以上~搞定!