這個Vectorian 是一個免費軟件,純製作Flash動畫,雖然沒有ActionScript支援,但看起來都不錯,很有以前Macromedia時代Flash 4的感覺。
http://vectorian.com
網頁
▼
2011年6月26日星期日
2011年6月24日星期五
Node.js 究竟是什麼?
IBM上一篇十分好的文,解釋Node.js的原理和用途。
http://www.ibm.com/developerworks/cn/opensource/os-nodejs/index.html?ca=drs-
另外還有 -
Intro to Node.JS for .NET Developers
The Node Beginner Book
http://www.ibm.com/developerworks/cn/opensource/os-nodejs/index.html?ca=drs-
另外還有 -
Intro to Node.JS for .NET Developers
The Node Beginner Book
2011年6月15日星期三
.NET Framework未日?
大家都睇過Windows 8既Demo,介面跟WP7一樣的Metro UI。
我自己就真的不懂欣賞Metro UI。
不過近一星期在外國的.NET Blogger就有很大迴響。
因為Windows 8的Native Application不是原先我們認為的WPF或者Silverlight,而是HTML5加Javascript。
所以當有一天Windows 8步入正軌時,一大眾開發Win32軟件的.NET人員怕自己的價值亦同樣地慢慢Fade out。
其實對於一直使用C#/VB寫Windows Form或WPF的開發人員來說,有一天返而要用HTML5+JS寫Windows底下的Native Application是一件很難接受的事。
而就Learning Curve來說,HTML5加各類新型JS Library如Node.js都不會低,重新學習誇平台的Java,或Python,反而可能更快上手,而且更值得投資。
我自己就認為,如果Windows 8一意孤行主力Metro UI,亦不向下兼容的話。
很可能大部份開發者還是專注返Windows 7的Win32平台。
最後演變成Vista時一樣,大部份人都只願意用XP不願升級。
如果想最簡單明白為什麼一眾Blogger都反對激烈的話,可以看這裡:
Why Microsoft has made developers horrified about coding for Windows 8
我自己就真的不懂欣賞Metro UI。
不過近一星期在外國的.NET Blogger就有很大迴響。
因為Windows 8的Native Application不是原先我們認為的WPF或者Silverlight,而是HTML5加Javascript。
所以當有一天Windows 8步入正軌時,一大眾開發Win32軟件的.NET人員怕自己的價值亦同樣地慢慢Fade out。
其實對於一直使用C#/VB寫Windows Form或WPF的開發人員來說,有一天返而要用HTML5+JS寫Windows底下的Native Application是一件很難接受的事。
而就Learning Curve來說,HTML5加各類新型JS Library如Node.js都不會低,重新學習誇平台的Java,或Python,反而可能更快上手,而且更值得投資。
我自己就認為,如果Windows 8一意孤行主力Metro UI,亦不向下兼容的話。
很可能大部份開發者還是專注返Windows 7的Win32平台。
最後演變成Vista時一樣,大部份人都只願意用XP不願升級。
如果想最簡單明白為什麼一眾Blogger都反對激烈的話,可以看這裡:
Why Microsoft has made developers horrified about coding for Windows 8
2011年6月11日星期六
2011年6月5日星期日
WordPress - 把圖片加入/重新連結Media Library
我用WordPress的時候,當時的WP版本並沒有Media Library,而當時自己亦沒有把圖片用"/年/月/"的資料夾架構去儲存,到後期才更正。
但早期的Blog Post中的圖片,就全部都儲存在"wp-content/uploads/images/"資料夾當中,數量已累積按近兩千張。
而自己一直都沒有太在意WordPress中的Media Library/Feature Images或Thumbnails功能,返正一直都是打完本文,用FTP上傳圖片,插入連結就算了。
大量的話就用自家製的SlideZoom上傳。
今天有時間就找一找有什麼Plug-in可以把舊有圖片匯入至Media Library當中,最後找到這一個叫Add From Server的Plug-in。
但Import後,在"Attached to"一欄中都是(Unattached),所有圖片只是匯入到Media Library,技術上可以說是把圖片資料Insert進wp_posts與wp_postmeta資料表,但都沒有與相應的Post/Page產生關聯(wp_posts表中的post_parent欄位),所以我就唯有自行寫一段PHP功能去修正。(當然是因為我找遍整個網上都沒有Plug-in做到吧...)
其實一個WP的Media檔案,都是記錄在wp_posts Table當中,WordPress只是用post_type去分辦,而guid就是WordPress認知的檔案連結。
而檔案自身一些Media資料就會放在wp_postmeta中,所以使用Add From Server匯入還是有必要的,因為它會把meta資料寫入wp_postmeta表之中,而不是草草了事。
最後一步就是搜尋你Blog Post中含有那個圖片,再把圖片關聯至post id。
PHP的程式如下,大家看我惡劣的英文Comment大概都可了解是做什麼:
以上的DB_HOST/DB_USER/DB_PASSWORD/DB_NAME不用刻意更改,因為會自動取自wp-config.php,把程式碼儲存至一個php檔案放在你WordPress的root資料夾,運行就可以,緊記完成後把那個php檔案刪除。
但早期的Blog Post中的圖片,就全部都儲存在"wp-content/uploads/images/"資料夾當中,數量已累積按近兩千張。
而自己一直都沒有太在意WordPress中的Media Library/Feature Images或Thumbnails功能,返正一直都是打完本文,用FTP上傳圖片,插入連結就算了。
大量的話就用自家製的SlideZoom上傳。
今天有時間就找一找有什麼Plug-in可以把舊有圖片匯入至Media Library當中,最後找到這一個叫Add From Server的Plug-in。
但Import後,在"Attached to"一欄中都是(Unattached),所有圖片只是匯入到Media Library,技術上可以說是把圖片資料Insert進wp_posts與wp_postmeta資料表,但都沒有與相應的Post/Page產生關聯(wp_posts表中的post_parent欄位),所以我就唯有自行寫一段PHP功能去修正。(當然是因為我找遍整個網上都沒有Plug-in做到吧...)
05/Oct/2011更新: 新版本3.2.0.2已修正這個問題,Quote內的可以不理。
其實用Add From Server匯入後,還會有一些問題。
假如你跟我一樣,圖片都沒有用"/年/月/"去分開,使用Add From Server匯入後,圖片雖然存放的位置不變,但WP Database中記錄的media absolute url就會含有"/年/月/"路徑。
所有你要運行以下SQL去修正連結。
執行前,小心把錯誤的圖片連結更改(如2011/06),做這個UPDATE之前,最好確認一個該月份是否真的存在圖片,以下面SQL為例,把含有2011/06的去掉,替換至實際的資料夾。
UPDATE wp_posts SET guid = replace(guid, '/wp-content/uploads/images/2011/06/' , '/wp-content/uploads/images/');
其實一個WP的Media檔案,都是記錄在wp_posts Table當中,WordPress只是用post_type去分辦,而guid就是WordPress認知的檔案連結。
而檔案自身一些Media資料就會放在wp_postmeta中,所以使用Add From Server匯入還是有必要的,因為它會把meta資料寫入wp_postmeta表之中,而不是草草了事。
最後一步就是搜尋你Blog Post中含有那個圖片,再把圖片關聯至post id。
PHP的程式如下,大家看我惡劣的英文Comment大概都可了解是做什麼:
<?php require_once ('wp-config.php'); require_once ('wp-admin/includes/admin.php'); require_once ('wp-includes/functions.php'); $server = DB_HOST; $username = DB_USER; $password = DB_PASSWORD; $dbname = DB_NAME; $url = get_bloginfo('url'); mysql_connect($server, $username, $password) or die(mysql_error()); mysql_select_db($dbname) or die(mysql_error()); //find out all attachment records which is no parent post. $sql = "SELECT ID, guid FROM `wp_posts` WHERE `post_type` = 'attachment' AND post_parent=0"; $attachment_post = mysql_query($sql); while ($rows = mysql_fetch_assoc($attachment_post)) { //$guid is the relative or absolute URL of images. $guid = str_replace($url, '', $rows['guid']); //find the first post , where post content contain the $guid (image url). //Due to WordPress's limitation, one media only can recognize to one post/page's ID. //If more than one Post/Page has use the media, WordPress will retain the first ID to media. $sql = "SELECT ID FROM `wp_posts` WHERE post_content LIKE '%" . mysql_real_escape_string($guid) . "%' AND post_type in ('post','page','template') ORDER BY `post_date` desc,`post_modified` desc LIMIT 1"; $match_post = mysql_fetch_assoc(mysql_query($sql)); //Update the attachment's post_parent to related post/page ID. $sql = "UPDATE `wp_posts` SET post_parent='" . $match_post['ID'] . "' WHERE ID=" . $rows['ID'] . " LIMIT 1"; mysql_query($sql); } echo 'Done!'; mysql_close(); ?>
以上的DB_HOST/DB_USER/DB_PASSWORD/DB_NAME不用刻意更改,因為會自動取自wp-config.php,把程式碼儲存至一個php檔案放在你WordPress的root資料夾,運行就可以,緊記完成後把那個php檔案刪除。