2012年2月21日

Apple Mac OSX Lion 10.7.3 安裝在 VMware 8.0.2



最近突然想玩玩MacOS
在幾年前我就知道有Black Apple的存在
但一直沒機會一窺究竟
這次無意間取得MacOSX Lion 10.7.3 安裝光碟
雖然不是Black Apple
還是可以來玩玩看!!

首先要準備幾個軟體:

1. MacOSX Lion 10.7.3 安裝光碟或印象檔
2. UltraISO
3. 7-zip
4. VMware 8.0以上版本(以下版本沒測試過)
5. VMware裝MacOSX的修補程式 unlock-all-v102
可在此下載
http://www.insanelymac.com/forum/index.php?showtopic=268531&st=0&p=1750629&#entry1750629
或
http://www.mediafire.com/?2y9kysgcudogc07

一切都就緒之後就可以開始啦!!

第一步要先把MacOSX的安裝映像檔dmg轉換為iso
先將dmg檔用7-zip解開

解開後在InstallMacOSX.pkg資料夾內有個InstallESD.dmg的檔案
用UltraISO打開他!!


然後選 Tools -> Convert

選擇要輸出到哪個資料夾
並選擇Standard ISO

選好之後按下Convert就成功將dmg檔轉換為ISO了!!


接下來要裝VMware的修補程式
讓VMware可以安裝MacOSX
將unlock-all-v102.zip解壓縮之後進入解壓出來的資料夾內
此時應該會看到各種作業系統的分類資料夾
我是在windows下操作的
所以進入windows資料夾內
並執行install.cmd
如果是vista以上版本的人
一定要按右鍵->以系統管理員身分執行

執行完畢後就可以打開VMware了
選擇Create New Virtual Matchine(新增新的虛擬機器)

選custom

選最新版本

選 I will install the operating system later.(我要晚點安裝作業系統)
接下來選Apple Mac OS X或Apple Mac OS X-64bit都可以

幫你的虛擬機器取個名子
和設定路徑

一定要選擇雙核心以上
要分配幾顆就自己決定摟

設定要分配多少RAM

設定上網方式
選擇NAT是最方便的模式

選LSI Logic

選Create a new virtual disk(新建一個虛擬硬碟)

選SCSI

自訂硬碟大小
10GB即可安裝,建議大小是15GB

虛擬硬碟的名稱

下一步先選Customize Hardware

將Floppy刪除

設定光碟機,選Advance

改成SCSI 0:2

設定Display,勾選Accelerate 3D graphics

之後就可以按close和finish離開
完成創建一個新的虛擬機器

掛載剛剛製作的ISO檔

之後就可以按啟動摟~~
一開始就可以看到令人感動的蘋果圖案!!



接下來不要急
先選擇磁碟工具程式

將剛剛創建的虛擬硬碟格式化
格式選Mac OS 擴充格式(日誌式)
 然後選清除

之後選重新安裝OSX

接下來都是設定而已
就隨個人喜好選擇吧




這裡可以暫時不填Apple ID,按繼續即可


設定登入帳號

之後就開始安裝啦~~


安裝好之後進入系統
把掛載的光碟改成darwin.iso
在VMware安裝目錄下

這時就可以選擇安裝VMware tools

安裝好之後就大功告成啦!!!!!
可以開始享受MacOS啦~~


你把心拿來,我便與你安心。


神光:「請求大師為我安心。」

 達摩:「你心有不安?」

 神光:「我雖致力求道,但總有不安之時。」

 達摩:「那將心拿來,我為你安。」

 神光:「我怎麼也找不到那顆不安的心。」

 達摩:「我已經將你的心安好了。」


 關於這篇故事,通常都不會有講解
從小就一直搞不懂
為什麼這樣就安好心了呢?
今天才稍微有所體悟
趕緊記下



 不安的不是心,而是頭腦產生的妄念

2012年2月10日

【C++】STL::map,一個兩兩對應的簡單資料結構



map是命名空間(name space)STD內的標準函式庫STL(Standard Template Library)裡的一個物件(class)
主要功能是作一個簡單的資料結構,可以存放多組key,value的對應資料。
使用方法也很簡單


#include <map>

#include <iostream>



using namespace std;



int main(int argc, char** argv) {

     //map<key, value=""> mapname;

     map<int, char*=""> items;

     items[12345] = "books";

     items[12346] = "tables";

     items[123456] = "phone";



    return 0;

}




這樣就輕鬆建立出一個ID(int)和物品(char*)的對應結構了!
key和value可以是任意的型態
也可以寫成

map<string, myclass> mapsomthing;

很方便使用吧!

如果要存取某個值也很簡單
跟用陣列一樣

cout << items[12345]; //print books

或是使用迴圈走訪每組數值的方式


for(map<int, char*>::iterator it = items.begin(); it != items.end(); it++){

        cout << "key: " << it->first << " value: " << it->second << endl;

}

基本上只要會靈活運用
這些就很夠用了
其餘還有可能會用到的有:find, erase, swap
使用方式都大同小異,看過範例之後應該就能懂了


map所擁有的member function如下:

member functions:
map::begin
map::clear
map::count
map::empty
map::end
map::equal_range
map::erase
map::find
map::get_allocator
map::insert
map::key_comp
map::lower_bound
map::max_size
map::operator=
map::operator[]
map::rbegin
map::rend
map::size
map::swap
map::upper_bound
map::value_comp


參考網站:
http://www.cplusplus.com/reference/stl/map/

2012年2月7日

【登山】宜蘭礁溪 - 聖母山莊朝聖步道(疑?五峰旗瀑布呢?)


這兩天都是出大太陽的好天氣
我跟爸媽決定出門泡湯踏青!
但因為我實在不太喜歡泡溫泉
所以就一個人跑去五峰旗瀑布亂晃了


一下就到了五峰旗瀑布的入口,這是地圖(點圖可放大)

入口步道,當天遊客還滿多的

會先經過一座小橋

很快就會到第一個戲水的地方
但我沒多做停留
繼續往上爬

路都還算好走
不會太陡
也不會太長

很快又到了另個景點
現場看那瀑布真是壯觀
但我竟然也沒多做停留就往上爬了


2012年2月3日

【PHP】PDO,PHP Data Object 一個安全又快速的資料庫連接物件


PHP.net 已經發佈基於安全因素,在未來一定會刪除mysql extention (原文: http://news.php.net/php.internals/53799)

想當年,我初次碰上php的時候也用了好一陣子的mysql_connect()
直到去年,痛下決心學習新的技術!
原因有二:
1. PHP.net已經決定放棄 php_mysql 這個擴充套件,學習只是遲早的事,趁早轉換才是明智的選擇!

2. 之前要寫一個function用人工方式過濾sql injection
 但你沒那麼聰明,永遠跟不上駭客的腳步,所以決定交給PDO來做這件事!

剛剛說到的SQL Injection,簡單來說就是一個填空遊戲,把本來要這樣做的事情變成另一個樣子。

SELECT * FROM `users` WHERE `user_name` = '$name' AND `passwd` = '$passwd';

中間的變數,就是空格,看起來好像是在找符合的使用者名稱和密碼,但其實如果沒有對變數做過濾,很可能變成什麼都列出來,甚至被清空整個DB。

而PDO則可以讓空格就是空格,只要明確定義變數的型態和長度,就可以避開SQL Injection或buffer overflow之類的攻擊

以下用實例來講解使用PDO連結MySQL資料庫的過程

//mysql:host=localhost;dbname=db,name,pw
$dbh = new PDO($dbType.":host=".$hostname.";dbname=".$database, $username, $password);
//attribute請參考 http://www.php.net/manual/en/pdo.getattribute.php
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//set charset
$dbh->query("SET character_set_connection=".$dbcharset.", character_set_results=".$dbcharset.", character_set_client=binary");

$presql = select * from `users` where `user_account` = :user and `user_passwd` = :pass Limit 1;
$stmt = $dbh->prepare($presql);
//http://www.php.net/manual/en/pdostatement.bindparam.php
$stmt->bindParam(":user", "myUserName", "string", 20);
$stmt->bindParam(":pass", "myUserPass", "string", 20);
$result = $stmt->execute(); //return true or false
//fetch type可參考http://www.php.net/manual/en/pdostatement.fetch.php
while( $arr = $stmt->fetch(PDO::FETCH_ASSOC) ){
      //do something
}


一開始先實體化(new)一個PDO物件
建構子可參考官網
PDO::__construct() ( string $dsn [, string $username [, string $password [, array $driver_options ]]] )
這裡我只傳了前三個參數
第一個dsn的定義是

The Data Source Name, or DSN, contains the information required to connect to the database.
In general, a DSN consists of the PDO driver name, followed by a colon, followed by the PDO driver-specific connection syntax. Further information is available from the PDO driver-specific documentation.

簡單來說要清楚描述欲連結的DB細節
有三種描述方式
在此我採用Driver invocation
dsn = mysql:host=localhost;dbname=db
接下去的兩個參數是登入的帳號跟密碼

再來是設定db handler的參數
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
在此設定了如有錯誤時會觸發Exception例外事件

接下來開始寫預備SQL敘述
官方也明確定義了何謂Prepare sql statement

Prepares an SQL statement to be executed by the PDOStatement::execute() method. The SQL statement can contain zero or more named (:name) or question mark (?) parameter markers for which real values will be substituted when the statement is executed.

在prepare sql內可包含0或多個命名點或問號,這些都會在被執行時被取代為一個實際的值
在此例我們將username和password各當作一個命名點
並在之後使用bindParam將命名點與實際的值組合起來
bindParam(":user", "myUserName", "string", 20);
在組合時即可明確定義該變數的型態為string並且長度為20
因此不管前端傳來任何奇形怪狀的字串(例如: ',;,--)都會被視為字串,而不會被當成sql語句的一部分!


最後再用execute來執行此SQL語句,並使用fetch function取得結果
就完成一次query了!


在網路上其實比較多用問號來取代變數的方式
但其實我覺得這樣會大大降低程式可讀性
尤其是在INSERT時,變數一多
想修改中間某個值,還要數是第幾個問號
實在浪費太多時間
在參考完PHP.net範例之後決定使用命名的方式瞜!


以上只是一個簡單的例子
建議各位熟悉操作以後
可以包成自己的class
像我就自己寫了一個class
把一些例行性的行為寫進function內
像是連接資料庫就寫一個connect()
這樣讓我節省了不少行code也節省了很多時間呢!

不過要特別注意!
PDO只能避免SQL Injection
XSS和其他的攻擊行為還是要特別小心喔!!

繼續寫吧!

米勒〈拾穗〉


過去因為懶惰
所以都沒什麼在寫!

最近受到很多人的啟發

的確

是該來繼續寫了!

磨練!懶惰 bye!