Archive

Archive for July, 2009

使用 TMPGEnc DVD Author 3 制作照片 Slideshow

July 28th, 2009 No comments

目录

TMPGEnc DVD SampleTMPGEnc DVD Author 3 简介
第一步:导入照片
第二步:设置slideshow参数
第三步:添加背景音乐
第四步:制作DVD菜单
第五步:模拟测试
第六步:输出成DVD电影
尾声:上传到Youtube

关于 TMPGEnc DVD Author 3

TMPGEnc DVD Author 3 (以下简称为TDA3)是一款由 TMPG公司 开发、用来编辑制作DVD电影的软件。它的界面直观友好,操作简单方便,制作的DVD电影品质优秀,实在是家居电影制作之必备工具-:) 在TMPG的官方网站罗列的 TDA3 的一堆特点之中,我个人觉得最重要的两点包括: (a) 多种视频格式的支持, 和 (b) DVD电影菜单的创建。

TDA3 支持的视频格式包括 DVD-VIDEO, DVD-VR, MPEG1/2, AVI, Windows Media, DivX, 还有 QuickTime (mov, qt, mp4, m4a, 3gp, 3g2)。你在制作自己的DVD电影的时候可以直接将上述格式的视频片断拖到 TDA3 的窗口里,TDA3 就会自动完成视频格式转换,最终将它们输出为DVD编码格式(MPEG2)。TDA3 的另一个简单实用的功能就是制作DVD电影菜单。TDA3 除了自带多种菜单模板,还可以让用户简单方便地定制自己的菜单模板。只要你具备一定的艺术细胞,你就能够制作出赏心悦目的菜单!

当然,这篇文章的目的不是用来吹捧 TDA3 的。本文将介绍 TDA3 的强大功能的冰山一角:制作照片slideshow。随着计算机和数码相机的普及,相信绝大多数家庭都在计算机硬盘上存有数目可观的照片。比如我的电脑上就存有几千张孩子的照片。这些照片记载了他从出生到上学的成长过程。当我看到这些照片的时候,就会勾起那些珍贵的回忆。最近我用 TDA3 将这些照片做成slideshow电影,这样刻盘之后就能直接在DVD机上面播放了。用 TDA3 制作照片slideshow的过程很简单,不过我还是决定把它写下来,这样以后需要的时候就能翻出来看看。

第一步:导入照片

启动 TDA3 后出现如图一所示的界面。可以看见在 TDA3 窗口的最上方有六个按钮:“Start”、“Source”、“Menu”、“Simulation”、“Output” 和 “Options”。其中前五个按钮即代表了用 TDA3 制作DVD电影所需的五个基本步骤,而 “Options” 按钮则用来调出系统菜单。在图一中,“Start” 按钮是高亮显示,表示我们现在位于制作DVD电影的第一步。此时除了 “Source” 按钮外,“Menu”、“Simulation” 和 “Output” 按钮都是虚的,无法选取。


图一:TMPGEnc DVD Author 3 启动后出现的初始界面。

在图一所示的界面中点击 “Start a new project” 打开一个新项目,就会进入制作DVD电影的第二步:“Source”,如图二所示。注意 TDA3 顶部的 “Source” 按钮变成高亮显示。在这一步里我们需要把想要制作成DVD电影的视频片断添加到刚打开的新项目里。在图二中,左边蓝色圆圈标记的部分是视频轨列表。每个 TDA3 的新项目默认有一个视频轨,名字叫 “Track 1”。你可以点击视频轨列表上方的 “Add a track” 按钮来添加更多的视频轨,而视频轨的名字则可以通过点击 “Settings” 按钮来修改。在这里顺便提一下视频轨的一个用途:你可以利用视频轨来分类组织自己的视频资料。例如你可以用第一个视频轨来播放旅游风光,用第二个视频轨来播放家人的录像,然后用第三个视频轨来播放自己录制的电视节目。不过此时我们不需要对视频轨列表做任何更改。


图二:打开一个新项目之后就可以选择开始制作照片slideshow了。

这篇教程的目的是制作照片slideshow,所以我们点击图二中右边的 “Add a slideshow” 按钮,会弹出 “Slideshow adding” 窗口,如图三所示。这个时候我们就需要添加用于制作照片slideshow的照片。你可以使用 “Add pictures” 按钮来选择想要添加的照片,不过更简单的方法则是使用“Folder import” 按钮。点击这个按钮可以导入一个目录里的所有照片(如果该目录中包含子目录的话 TDA3 还会询问你要不要将子目录的照片也一并导入)。当你成功使用 “Folder import”功能导入照片后就会看到如图四所示的界面。


图三:在 “Slideshow adding” 窗口里导入照片。


图四:顺利导入照片后点击 “Slideshow Settings” 来设置相应的参数。

第二步:设置slideshow参数

在第一步里我们成功地往slideshow里添加了照片。下面我们需要设置slideshow一些相应的参数。这些参数主要包括每张照片显示的时间和照片之间的过渡特效。点击图四中的 “Slideshow settings” 按钮会弹出 “Slideshow settings” 对话框,如图五所示。在 “Clip name” 中你可以输入合适的名字。每张照片的显示时间则在 “Picture display length” 中设定(我设置的是6秒钟)。接下来可以设置照片和照片之间转换时使用的过渡特效。三个 radio button 从上到下依次是:无特效、随机特效,和指定一种特效。右边的那个大图标会显示出你指定的那种特效效果。最后的 “Resize settings” 选择默认的 “See the entire picture” 就好。设置完之后点击 “OK” 就可以返回到前一个窗口,即 “Slideshow adding” 窗口。


图五:在 “Slideshow settings” 窗口里设置slideshow参数。

第三步:添加背景音乐

接下来我们需要为slideshow陪上动听的或者不动听的音乐。点击 “Slideshow adding” 窗口上方的 “Audio”按钮出现如图六所示的界面。“Audio stream mode” 选择 “Audio stream 1 only”。然后点击 “Audio input 1” tab 里面的 “Browse…” 按钮选取作为背景音乐的歌曲(我这个老帮子选择的是童安格的一首老歌“一生中的第一”)。最下面需要勾上 “Loop Audio 1 to slideshow duration”, 这样背景音乐就可以循环播放。


图六:为slideshow添加背景音乐。

值得一提的是点击图六中间的 “Audio filters settings” 可以对背景音乐进行一些简单的处理。例如改变音乐的音量、获得音乐渐进和渐出效果、消除噪音等等。这些都留待你去试验了。

到这里添加背景音乐的工作就结束了。在返回 TDA3 主界面之前,我们点击 “Slideshow adding” 窗口上方的“Preview” 按钮去看看最后制作出来的照片slideshow将会是什么样的效果。一切满意后点击下面的 “OK” 按钮回到 TDA3 的主界面,如图七所示。为方便起见,点击视频轨列表里 “Track 1” 的 “Settings” 按钮将 Track 的名字改为“照片集”。


图七:Slideshow已经被添加到 “Track 1” 视频轨里面去了。

第四步:制作DVD菜单

在这一步里我们将为自己的DVD电影制作一个酷酷的菜单。点击 TDA3 窗口上方的 “Menu” 按钮,TDA3 的菜单制作向导会自动运行。如果你得到的是如图八所示的界面,则可以点击 “Launch the menu wizard” 按钮来启动菜单制作向导。


图八:点击 “Menu” 按钮开始制作菜单。

图九显示了用菜单向导制作DVD电影菜单的第一步。上面的三个 radio button 分别表示:使用 TDA3 自带的模板制作菜单、自己定制菜单,和不使用菜单。TDA3 自带的菜单模板既漂亮又专业,所以我选择了第一个radio button。图九下方的下拉菜单条可以用来选择制作的DVD电影是在4:3的普通电视上播放还是在16:9的宽屏电视上播放。我只有一个21吋的普通屏幕电视,所以选择了4:3。

接下来的三个步骤都很直观明了,如图十到图十二所示。注意在图十所示的菜单制作向导的第二步中我选择了 “Cyber” 模板。点击菜单制作向导最后一步(图十二)中的 “OK” 按钮就会回到 TDA3 的主界面,如图十三所示。


图九:菜单制作向导第一步。


图十:菜单制作向导第二步。


图十一:菜单制作向导第三步。


图十二:菜单制作向导第四步。


图十三:菜单制作成功!

如果你想更改显示在菜单里的图片,可以双击图片,就会出现 “Menu item editor” 窗口,如图十四所示。使用画面下面的水平滚动条将画面拖到你想要显示在菜单里的照片,然后点击 “Set as start frame” 和 “Set as end frame” 各一次。最后点击 “OK” 就会发现菜单里的图片已经改过来了,如图十五所示。


图十四:打开 “Menu item editor” 窗口更改显示在菜单里的图片。


图十五:菜单里的图片已经被更改了。

第五步:模拟测试

对于“模拟测试”没有什么需要阐述的。它的主要作用是让你预览一下最终制作成的DVD电影在DVD机上播放时的效果,如图十六所示。


图十六:使用“模拟测试”功能可以预览最终DVD电影的效果。

第六步:输出成DVD电影


图十七:制作DVD电影的最后一步:编码输出。


图十八:TDA3 在孜孜不倦地编码。

尾声:上传到Youtube

Categories: Tips and Tricks Tags: ,

Maze Game

July 20th, 2009 2 comments

Introduction

This is a maze game that I wrote when I was learning C# and Breadth First Search algorithm. The goal of the game is to find a path that connects the Start point (red square) and the End point (dark green square). You use the arrow keys to move your indicator (blue square). The path is marked with light green squares. If you get stuck, just click “Game” -> “Solution” to view the solution. Here is a screenshot of my “Maze Game”:

MazeGame

How to Play

As mentioned above, the goal of the game is to find a path that connects the Start point (red square) and the End point (green square). Click “File” -> “New Maze” to start a new game. Use the arrow keys to move your indicator (blue square). If you get stuck, just click “Game” -> “Solution” to view the solution.

Download

You are welcome to download the game and try it out. The game can be downloaded here. After downloading the file, unzip it. Then double click “MazeGame.exe” to run. If you find any bugs or have any comments, please let me know. Thanks for looking!

Note
You need Microsoft .NET Framework 2.0 to run this tool. Microsoft .Net Framework can be downloaded from Microsoft website.

Categories: C#, Game Tags: ,

Visual C# Note: Open a File in Your Own Program When Double Clicking the File

July 19th, 2009 No comments

Suppose you want to open *.cwd files in your own program when you double click them. Here is how to do it:

  1. First of all, you need to make sure your program understands the structure of *.cwd files and knows how to open them.
  2. Set your program to be the default application to open *.cwd files. This is done by following these easy steps:
    1. Right click a .cwd file.
    2. Select “Open With” -> “Choose Program …”
    3. In the “Open With” dialog, check “Always use the selected program to open this kind of file” and press “Browse…”
    4. Find your application in the open file dialog and click “OK”.

    These way when you double click a .cwd file, the default action will be openning it with your application.

  3. Add a constructor in your main window form class. This constructor takes one parameter (the file name) from the Main(string[] args) function and open the file in your program.

Here is an example code that shows how to open *.cwd files in your C# application:

Program.cs:
 
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
 
        [STAThread]
        static void Main(string[] args)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            if (args.Length > 0)
                Application.Run(new Form1(args[0]));
            else
                Application.Run(new Form1());
        }
    }
Form1.cs:
 
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        public Form1(string filename)
        {
            InitializeComponent();
            if (filename != null)
                LoadFile(filename);
        }
 
        private void LoadFile(string filename)
        {
            //
            // put your code here to load *.cwd file
           //
        }
    }
Categories: C# Tags:

Creat an “Archives” Page in Your WordPress Blog

July 18th, 2009 No comments

[ Note: You need to have “Exec-PHP” plugin activated in order for the code in this post to work. ]

I planned to create an “Archives” page in my blog. On this “Archives” page, I wanted to list all my posts and organize them in categories. In each category, posts would be sorted by date.

Obviously I needed to write some PHP code and use a few WordPress functions to achieve this goal. The first step was to retrieve all the categories from my blog. This was done using get_categories() function:

$categories = get_categories('orderby=name');
foreach ($categories as $cat)
{
    echo $cat->cat_name;
    echo ' (';
    echo $cat->category_count;
    echo ')';
    echo '<br />';
}

For every category retrieved from my blog, I needed to get all the posts in that category and list them in a table. To do this, I needed to create my own “Loop” in my code. There is a post on BlogChemistry.com talking about creating customized “Loop” in three ways. The first two methods, which involve using query_posts() and get_posts(), did not work for me. When I tried them, for some reason, the_permalink() and the_title() functions did not return the permalinks and the titles of the posts. Instead, they only returned the permalink and the title of the page -:( The third method involves using WP_Query class, which worked nicely for me. There is another good article on WP_Query.

To create a customized “Loop”, I made an instance of the WP_Query class and did it from scratch:

$my_query = new WP_Query($query_string);
if ($my_query->have_posts())
{
    while ($my_query->have_posts())
    {
        $my_query->the_post();
        echo the_permalink();
        echo the_title();
    }
}

After adding some HTML formatting tags and putting all together, I got the complete source code for my “Archives” page:

WordpressArchivesPageCode

Daylight Saving Time in WordPress 2.8

July 17th, 2009 No comments

Starting from version 2.8, WordPress is capable of adjusting for daylight saving time automatically. In order for WordPress to do this, you have to choose a nearest city in the WordPress timezone setting. Go to “Dashboard -> Settings -> General”. Choose the city that is closest to you in the “Timezone” drop-down menu. In my case, I chose “Los Angeles” since I’m located in California.

WordpressTimeZone02
Figure 1. If you choose a city from Timezone drop-down menu, WordPress will automatically adjust for daylight saving time.

One thing to note is that you have to choose a city from the drop-down menu. If you choose a “Manual Offset” timezone, say, “UTC -8:00”, WordPress would not be able to adjust for daylight saving time automatically, as shown in the following figure:

WordpressTimeZone01
Figure 2. If you choose a “Manual Offset” timezone, WordPress will NOT automatically adjust for daylight saving time.

升级WordPress遇到的问题

July 11th, 2009 No comments

前两天我在博客里提到我把自己的 Blog 搬家,顺便把wordpress从1.5版本升级到了2.8.1版本。升级的过程并不是一帆风顺,其间遇到了一些数据库方面的问题。

我最初的计划是按照 Yan’s Five Easy Steps 将Blog移植到新主机上。本来Yan的方法简单易懂,按照他的步骤应该很快就能搞定。可是偏偏在第五步,也就是在 phpMyAdmin 中将旧数据库的数据导入到新数据库的时候出问题了。phpMyAdmin 报错,然后提示导入失败。我试了好几次都是同样的结果(后来我想了一下,很有可能 wordpress 在1.5版本之后修改了数据库结构,使得旧数据库的数据无法导入到新数据库)。万般无奈之下,我只好求其次,使用 wordpress 自带的导入/导出功能把旧帖子搬了过来。这个方法似乎解决了问题,因为在我粗略浏览了一下 Blog 后并没有发现什么问题。

但是第二天当我在 wordpress 的 Dashboard 里面进行一些维护工作时发现了一些问题。

  1. 首先是 Dashboard 显示的帖子总数不对,如图一所示。
  2. 从图中可以看到,在 Dashboard 中显示的我的 Blog 帖子总数为105,发表了的帖子数为35。事实上我的 Blog 一共只有35个帖子,一个不多一个不少。那么这凭空多出来的70个帖子是从哪里来的呢?

    WPDashiboard-Posts
    图一、Wordpress的Dashboard里面显示的帖子总数不正确。

    经过仔细检查,我用 phpMyAdmin 发现了 wordpress 数据库的问题。图二显示的是 wordpress 的 wp_posts 表的一个截图。从图中可以看到 wp_posts 中包含有两个 fields:post_statuspost_type。而从表一中可以看到 wordpress 的1.5版本和2.8.1版本对post、page、和 attachment 的处理是不一样的。

    WPDatabaseMess
    图二、Wordpress的wp_posts数据库里的数据有错误。

    表一、Wordpress的1.5版本和2.8.1版本对post、page、attachment的不同处理。

      WordPress 1.5版本 WordPress 2.8.1版本
    post_status post_type post_status post_type
    post (published) publish post publish post
    page static post publish page
    attachment attachment post inherit attachment

    在1.5版本中,post、page 和 attachment 对应的 post_type 都是 post,区分它们的是 post_status。而在2.8.1版本中,post、page 和 attachment 对应的 post_type 各不相同,相应的 post_status 也有少许区别。明白了这点,再回头来看上面的帖子总数问题就容易理解了。原来当 wordpress 导入旧 Blog 的时候沿用了1.5版本的数据,导致所有的post、page 和 attachment 都被 wordpress 认为是 post。因此在 Dashboard 里面显示的帖子总数比实际帖子数多。

    为了改正这个错误,需要在 phpMyAdmin 输入 SQL 命令对 wordpress 数据库进行修改。首先我们要把 attachment 的 post_typepost 改成 attachment,把 post_statusattachment 改成 inherit。相应的 SQL 命令是:

    UPDATE wp_posts SET post_type="attachment" WHERE post_status="attachment";
    UPDATE wp_posts SET post_status="inherit" WHERE post_type="attachment";

    接着我们要把 page 的 post_typepost 改成 page,把 post_statusstatic 改成 publish。相应的 SQL 命令是:

    UPDATE wp_posts SET post_type="page" WHERE post_status="static";
    UPDATE wp_posts SET post_status="publish" WHERE post_type="page";

  3. wp_posts 表中 guid 一栏的网址都是 Blog 移植前的网址,如图二所示。
  4. 我的新 Blog 的地址是 “http://tech.eternj.net”,而 guid 栏里显示的是我的旧 Blog 的网址:”http://highdrawer.strangled.net/blog”,因此需要把 guid 里的地址改正过来。相应的 SQL 命令是:

    UPDATE wp_posts SET guid=REPLACE(guid, 'http://highdrawer.strangled.net/blog', 'http://highdrawer.eternj.net');

    WPDatabaseGuid
    图三、wp_posts 表里的 guid 显示的是旧 Blog 的地址。

  5. wp_posts 表里的 post_parent 栏里的很多数值都是错误的。
  6. 这个问题直接导致在 Dashboard 里面显示 Media 的时候,每个附件和其对应的帖子完全弄混。解决这个问题没有好办法,只有手工修改每一个错误的数值。

Blog搬家

July 9th, 2009 No comments

今天把自己的博客移植到了一个新主机上。搬家的原因主要出于以下考虑:以前的博客是建立在自己的个人电脑上的,虽然管理和维护起来非常方便,但是在线时间不能保证,而且上传速度很慢,一旦图片多了就会严重影响浏览速度。现在这个博客的新主机是由 www.bluehost.com 提供的,希望更换主机后博客的在线时间和浏览速度会有显著改善(从这几天的测试来看我还是比较满意的)。

另外,趁着换主机,我顺便把 wordpress 从1.5版本升级到了2.8.1版本。原来的 wordpress 版本太低了,很多新 theme 和 plugin 都不能用。升级之后能够尝试更多的模板和插件了。

Categories: Uncategorized Tags: ,

Change Page Orders in WordPress

July 8th, 2009 No comments

Directly copied from WordPress support page:

Pages are usually ordered alphabetically, but you can change the order pages are displayed in by using the order field.

Let’s say you have three pages: Animals, Machines, WordPress.

That is the order they will normally appear in. If you wanted WordPress to appear first, you need to do the following:

1. Click Pages –> Edit on the menu.
2. Find the page WordPress and click the title.
3. Find the Attributes module.
4. Put the number 1 in the text field for Order. This tells WordPress to make this the first page in the list.
5. Click the Update Page button.

Repeat the process for your other pages, but use higher numbers for the Order field: 2, 3, etc. This tells WordPress to make these the second and third items in the list.

If you are using the Pages Widget, you will want to edit the widget, click on the Sort By dropdown, and change it to Page Order. Then click the Done button on the widget options box and finally, click the Save Changes button.

Exec-PHP Plugin for WordPress

July 8th, 2009 No comments

In order to execute PHP code in your wordpress post, you will need a plugin that does that for you. I am using Sören Weber’s Exec-PHP plugin.

Install

To install the Exec-PHP plugin:

  1. Download the Exec-PHP plugin archive and extract the files.
  2. Copy the resulting exec-php directory into /wp-content/plugins/ directory.
  3. Activate the plugin through the “Plugins” menu of WordPress (after a fresh installation only the Administrator is allowed to execute PHP code).
  4. Configure blog and user settings if needed.

Usage

With Exec-PHP you can execute PHP code in the excerpt and the content portion of your posts and pages (in the following called articles) as also as in text widgets. To execute code, just type in the PHP code as you usually would, encapsulated in <?php ?> tags.

What if I just want to print out PHP code and don’t execute it?

If you just want to print out code and don’t want to execute it, you have to make sure to convert your code to the correct XHTML representation. To do so you have to escape the following characters: < to &lt;, > to &gt;, and & to &amp;.

Categories: Wordpress Tags: , ,

Image Path Broken after Changing Permalinks in WordPress

July 8th, 2009 No comments

The Problem

It is common to use relative image paths in your wordpress post. If you put the image files in the images folder of the root directory. Then the path to, say, logo.jpg is coded as

<img src="/images/logo.jpg" />

This works until you change your permalinks. Permalinks change the url to reflect a directory stucture in place of the ugly '?page_id=127', thus breaking the path to images folder.

The Hack

Where you have used relative image paths, replace it with

<img src="<?php echo get_option('siteurl'); ?>/images/logo.jpg" />

This uses your specific siteurl as a prefix to the path of the image.

Hope this helps, it is a great hack.