1/19/2010

CRC運算的查表法原理

原理是你在做長除法時,

第一步會看第一位, 會寫一個商數到上面, 然後乘積寫在下方, 把被除數 減掉(xor) 乘積, 得到第一回合餘數r1

重點是如果你看r1的第一個bit, 只會跟"原始被除數"的第1,2個bit有關
再做一回合, r2的第一個bit, 只會跟"原始被除數"的第1,2,3個bit有關

從這裡我們可以推敲是否需要xor除數, 產生控制紀錄 (yes, no, yes, yes, yes, no...) 只是用{1,0}來表示

欲計算m(x) + a(x) + b(x) + c(x) + d(x)
我們可以先算好a(x) + b(x) + c(x) + d(x)的結果, 再+ m(x)

先算好a(x) + b(x) + c(x) + d(x)的結果就是所謂的TABLE啦,
詳細步驟還是看上面的URL.

1/09/2010

PowerpointMerger 合併數個ppt檔案

解決向上級匯報時, 生不出素材的困擾.
我是採用Office 2007的系統, powerpoint object model是不一樣的.

執行檔下載點
參考資料:
Simple Powerpoint automation using C#
MSDN Office development

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using Microsoft.Office.Core;
using PowerPoint = Microsoft.Office.Interop.PowerPoint;

namespace PowerpointMerger
{
    public partial class Form1 : Form
    {
        static int MAX_SLIDE_NUMBER = 10;
        string[] filepath = new string[MAX_SLIDE_NUMBER];
        string templatePath;

        PowerPoint.Application objApp;
        PowerPoint.Presentations objPresSet;
        PowerPoint._Presentation objPresMerged;
        
        PowerPoint.Slides objSlidesMerged;
        
        //PowerPoint.Slides objSlidesSrc; //來源的ppt slides
        //PowerPoint.Slides objSlidesDst; //合併的目標ppt slides        

        public Form1()
        {
            InitializeComponent();
        }        

        public void start()
        {
          
            //Create a new presentation based on a template.
            objApp = new PowerPoint.Application();
            objApp.Visible = MsoTriState.msoTrue;
            
            objPresSet = objApp.Presentations;
            if (File.Exists(templatePath))
            {
                // 開啟template
                objPresMerged = objPresSet.Open(templatePath, MsoTriState.msoTriStateMixed, MsoTriState.msoTrue, MsoTriState.msoTrue);
            }
            else
            {
                objPresMerged = objPresSet.Add(MsoTriState.msoTrue); //產生一個新的
            }
            objSlidesMerged = objPresMerged.Slides; // 取得新的merged slides

            // merge slides                      
            int numSlides = 0;
            for (int i = 0; i < MAX_SLIDE_NUMBER; i++)
            {
               numSlides = MergeSlide(this.objSlidesMerged, filepath[i], numSlides);
            }

            // save as a copy to ..
            // objPresMerged.SaveCopyAs("E:\\test_new.ppt", Microsoft.Office.Interop.PowerPoint.PpSaveAsFileType.ppSaveAsDefault, MsoTriState.msoTrue);
            // objApp.Quit();
        }

        private int MergeSlide(PowerPoint.Slides objSlidesMerged, string path, int numSlides)
        {            
            if (File.Exists(path))
            {
                PowerPoint._Presentation ps = objPresSet.Open(path, MsoTriState.msoTrue, MsoTriState.msoTrue, MsoTriState.msoFalse);
                // expression.InsertFromFile(FileName, Index插入點, SlideStart來源檔起始點, SlideEnd來源檔結束點)
                int numInserted = objSlidesMerged.InsertFromFile(path, numSlides, 1, ps.Slides.Count);
                numSlides += numInserted;
            }
            return numSlides;
        }

        /// <summary>
        /// 將檔案路徑設定到filepath陣列, 方便merge時以迴圈處理.
        /// </summary>
        /// <param name="index"></param>
        /// <param name="path"></param>
        private void setFilePath(int index, string path)
        {
            filepath[index] = path;
        }

        private void buttonStart_Click(object sender, EventArgs e)
        {
            start();
        }

        private void btn1_Click(object sender, EventArgs e)
        {
            openFileDialog1 = new OpenFileDialog();
            openFileDialog1.Filter = "Powerpoint files (*.ppt)|*.ppt";            
            if (openFileDialog1.ShowDialog() == DialogResult.Cancel)
                return;
            textBox1.Text = openFileDialog1.FileName;
            setFilePath(0, textBox1.Text);
        }

        private void btn2_Click(object sender, EventArgs e)
        {
            openFileDialog2 = new OpenFileDialog();
            openFileDialog2.Filter = "Powerpoint files (*.ppt)|*.ppt";            
            if (openFileDialog2.ShowDialog() == DialogResult.Cancel)
                return;
            textBox2.Text = openFileDialog2.FileName;
            setFilePath(1, textBox2.Text);
        }

        private void btn3_Click(object sender, EventArgs e)
        {
            openFileDialog3 = new OpenFileDialog();
            openFileDialog3.Filter = "Powerpoint files (*.ppt)|*.ppt";            
            if (openFileDialog3.ShowDialog() == DialogResult.Cancel)
                return;
            textBox3.Text = openFileDialog3.FileName;
            setFilePath(2, textBox3.Text);
        }

        private void btn4_Click(object sender, EventArgs e)
        {
            openFileDialog4 = new OpenFileDialog();
            openFileDialog4.Filter = "Powerpoint files (*.ppt)|*.ppt";            
            if (openFileDialog4.ShowDialog() == DialogResult.Cancel)
                return;
            textBox4.Text = openFileDialog4.FileName;
            setFilePath(3, textBox4.Text);
        }

        private void btn5_Click(object sender, EventArgs e)
        {
            openFileDialog5 = new OpenFileDialog();
            openFileDialog5.Filter = "Powerpoint files (*.ppt)|*.ppt";            
            if (openFileDialog5.ShowDialog() == DialogResult.Cancel)
                return;
            textBox5.Text = openFileDialog5.FileName;
            setFilePath(4, textBox5.Text);
        }

        private void btnTemplate_Click(object sender, EventArgs e)
        {
            openFileDialogTemplate = new OpenFileDialog();
            openFileDialogTemplate.Filter = "Powerpoint files (*.ppt)|*.ppt";
            if (openFileDialogTemplate.ShowDialog() == DialogResult.Cancel)
                return;
            
            templatePath = openFileDialogTemplate.FileName;
            textBox6.Text = templatePath;
        }
    }
}

1/03/2010

2010新春出遊 觀霧+白蘭+清泉+北埔


檢視較大的地圖

桃山隧道因為拓寬坍塌封閉, 必須從白蘭部落繞道到觀霧, 我們運氣不錯下車散步時都沒下雨. 觀霧的霧氣真的很大, 氣溫大約6-7度. 走40分鐘能下到觀霧瀑布, 可惜冬天水量很少, 回程爬60分鐘非常辛苦. 山間的新鮮空氣對肺活量蠻有幫助的, 而且能看到大片筆直的樹林藏在霧中(都沒有檳榔樹)非常感動, 好像阿凡達的場景.

離開觀霧時已經起大霧而且下雨, 一路跟著"大頭","小蘿蔔頭","豬頭"車隊挺進抵達白蘭(浮雲山莊), 老闆娘和小老闆很熱情, 小老闆自彈自唱加上小米酒招待, 老闆娘則是演唱教會歌曲和分享與上帝相遇的小故事.

木頭房間很舒服, 雖然我一直覺得被子潮濕會睡不好, 晚上蓋著還是蠻暖和的.
殺手玩了幾盤就有點過High, 之後交換禮物換到一個香氛蠟燭, 一本書, CD和購物袋.
太陽剛升起時山間沒有霧氣很漂亮, 可以欣賞雲海, 不過沒一個小時就把整個部落覆蓋.

張學良故居+清泉(井上溫泉)和白蘭很近大約10分鐘車程, 有免費的泡腳池(水質不太乾淨), 三個吊橋中間的地方可以通往三毛故居, 有三毛生平的介紹和生活照. 牆上有封叮嚀的信, 希望大家都把垃圾帶走, 不要勸原住民一起喝小米酒, 傷害彼此的健康.

可能放連假的關係, 今天北埔的人超級多, 內灣跟北埔應該是新竹人連假最後還想玩一天的首選. 我們也去吃了號稱不會溶化的幸運草良口冰, 老闆很詳細地介紹冰淇淋冰晶溶化原理. 咖啡比較久回甘的時間, 宇智金石冰(抹茶紅豆)的氣味停留比較短暫. 我不能吃到咖啡因, 所以點巧克力加牛奶, 不過額外有一球薑汁口味冰淇淋很特別, 也很好吃.