星期三, 10月 31, 2007
WebBrowser讀取frame
1.get frame by id
HtmlWindow frame = currentWindow.Frames["aaa"]
2.get frame one by one
foreach (HtmlWindow frame in currentWindow.Frames)
{
//frame即為所求
}
*有n個frames的會跳n次completed+本身的html page 共n+1次
資源:HtmlWindow.Document 屬性
星期二, 10月 30, 2007
div隱藏技
用法:<[div] id="test" style="visibility: none;">
屬性選項:
visibility: hidden;
visibility: visible;
Javascript寫法
document.getElementById("test").style.visibility="hidden";
document.getElementById("test").style.visibility="visible";
利用display可以讓後面的物件往上拉
用法:style="display: none;"
屬性選項:
none;//隱藏
空白即為顯示
javascript寫法
document.getElementById("test").style.display="none";//隱藏
document.getElementById("test").style.display="";//顯示
星期四, 10月 25, 2007
lapasta 義麵屋
吃過最好吃的義大利麵了吧
而且很划算 平均200多塊錢一盤
份量很多 而且加麵不加價
原本在天母中山北路
後來搬到...天母新光那兒...
取得運算過的static變數
總之就是不new一個class
而要直接使用ClassName.attribute
public class a
{
public static string aString="hi";
static
{
aString += " this is how it works";
}
}
ex. a.aString; ==> hi this is how it works
星期二, 10月 23, 2007
星期一, 10月 15, 2007
VNC(Virtual Network Computing)- 遠端遙控軟體
VNC 官方網站:http://www.realvnc.com
步驟:
安裝vnc (//Fedora發行版巳包含了VNC軟體)
=>apt-get install vnc-server
啟動vnc server (初次啟動server會要求密碼,啟動後會在各user家目錄下產生.vnc資料夾)
=>vncserver //vncserver跟/etc/rc.d/init.d/vncserver似乎不一樣
修改畫面設定檔
=>vi ~/.vnc/xstartup 取消此兩行前面的 #
unset SESSION_MANAGER
exec /etc/X11/xinit/xinitrc
p.s Fedora發行版巳包含了VNC軟體,不過預設使用TWM視窗管理程式,可以修改為GNOME如下:
mkdir /etc/vnc/
用文書編輯軟體開啟 /etc/vnc/xstartup 輸入一行 exec /etc/X11/xinit/Xclients 後存檔離開
chmod+x /etc/vnc/xstartup
修改帳號設定檔
=>vi /etc/sysconfig/vncservers
# VNCSERVERS="1:myusername" 修改成-->VNCSERVERS="1:root"
# VNCSERVERARGS[1]="-geometry 800x600"
重新啟動
/etc/rc.d/init.d/vncserver restart
開放port
VNC使用兩個port,請記得開放,5801:tcp,5901:tcp
測試
使用網頁瀏覽器遠端遙控 Fedora:http://IP:5801
註:
因為使用瀏覽器連上 vncserver 的時候會執行 java applet,所以 client 端一定要先安裝 java 相關軟體才行
http://www.java.com/zh_tw/download/manual.jsp
TightVNC for Windows:http://umn.dl.sourceforge.net/sourceforge/vnc-tight/tightvnc-1.2.9-setup.exe
使用網頁瀏覽器遠端遙控 Windows:http://IP:5800
Pthread
2.compile時,加入-pthread參數
範例=========================
#include <stdio.h> #include <stdlib.h> //因為在fc系統下,exit會有warnning,include此就不會有了 #include <pthread.h> //unix下的多執行緒 void *mythread(void *arg) { for (;;) { printf("thread\n"); sleep(1); } return NULL; } int main(void) { pthread_t th; if (pthread_create(&th,NULL,mythread,NULL)!=0) exit(0); for (;;) { printf("main process\n"); sleep(3); } }
main process
thread
thread
thread
main process
thread
thread
thread
main process
thread
thread
thread
索引
何時可利用索引
- where引數資料篩選
- SELECT * FROM employee WHERE EmpID = 'xxx' //先替EmpID建立索引,將能提昇查詢速度
- SELECT * FROM employee WHERE Salary BETWEEN 6000 and 7000 //先替Salary 建立索引,將能提昇查詢速度
- Order By
- SELECT name FROM employee ORDER BY name //建立name索引
- GROUP By
- SELECT department,avg(salary) FROM employee GROUP BY department //建立department索引
- 連結資料表
- SELECT * FROM Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID //替Customers資料表根據CustomerID欄位建立索引,並替Orders資料表根據CustomerID建立索引,資料表連結速度會大幅提升
- 先檢查存在根據適當欄位建立的索引,以及確認此索引是否有助於本次的存取作業
- 確實存在有助益的索引,SQL Server即會使用索引表的資料記錄,再繼續步驟2
- 如不存在,即進行「資料表掃描」完成存取作業
- 會從根分頁開始,沿著索引樹狀結構尋找查詢所要的資料
- 將符合查詢條件資料記錄篩選出來
星期六, 10月 13, 2007
Thread Lock與Monitor的不同
說明:對資源取得獨佔
Method:
public void lock(Object obj)
語法:
lock(objlock)
{
同步化執行相關程式碼
}
Thread.Monitor class
說明:進一步阻斷或繼續特定thread的動作,使資源能夠被控制
Method:
//回復第一個被暫停的thread
public static void Pulse(Object obj)
//釋放該thread佔有的資源
public static bool Wait(Object obj,int milliseconds)
public static bool Wait(Object obj):
*使用monitor方法時,需將其包在enter和exit中
ex.
Monitor.Enter(this);
...
Monitor.Pulse(this);
...
Monitor.Exit(this);
當存在一個以上的執行緒,而其中一個必須等待另一個完成,才能繼續執行
Trehad.Sleep()只能單純暫停執行,因此變不適用
Thread類別提供Join() -- Thread 等待其他Thread完成
例:有兩個threads
thread1.start();
thread2.start();
當thread2.Join()時,thread1會等待thread2執行完。
星期二, 10月 09, 2007
星期一, 10月 08, 2007
利用panel放背景圖
{
protected void paintComponent(Graphics g)
{
// g.drawImage(ic.getImage(), 0, 0, null);
// Scale image to size of component
Dimension d = getSize();
g.drawImage(ic.getImage(), 0, 0, d.width, d.height, null);
// Fix the image position in the scroll pane
// Point p = scrollPane.getViewport().getViewPosition();
// g.drawImage(icon.getImage(), p.x, p.y, null);
super.paintComponent(g);
}
};
panel.setOpaque( false );
panel.setPreferredSize( new Dimension(400, 400) );
getContentPane().add( panel);
JButton button = new JButton( "Hello" );
panel.add( button );
panel.setBounds(getBounds());
[C#] 如何設定為全螢幕模式
[C#] 如何設定為全螢幕模式
Chui-Wen Chiu(Arick)
2007.03.16 建立
要將視窗設定為全螢幕模式[1][5],主要有兩個部份
1. 視窗無框線
2. 視窗大小等於螢幕大小
在 .NET 的 Windows Form 中,只需要透過簡單的設定即可達到這個效果,
1. Form.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; //設定成無框線[2]
------ 指this (form)
2. Form.WindowState = FormWindowState.Maximized; // 視窗設定為最大化[3]
------ 指this (form)
如果要設定更穩妥一點,可以再將視窗設定為最上層顯示,也就是將 Form.TopMost [4]設定為 true。
一 般情況下,上述的作法就可以滿足,如果你想做的更好一些,將 Windows 工具列隱藏而非覆蓋[6],此時需要透過 Windows API 來達成,主要的概念是用 FindWindow 找尋工具列的視窗 Handle,再透過 ShowWindow 將該視窗 Handle 隱藏,C# 要實現這個機制的成片段如下
private const int SW_HIDE = 0; private const int SW_SHOW = 1; [DllImport("user32.dll")] private static extern int FindWindow(string className, string windowText); [DllImport("user32.dll")] private static extern int ShowWindow(int hwnd, int command); int hWnd = FindWindow("Shell_TrayWnd", ""); ShowWindow(hWnd, SW_HIDE); |
理 想上,上述已經算是相當的完美,但依據[5][6]的說法,即便是將工具列隱藏和 Form.WindowState = FormWindowState.Maximized 仍可能會使應用程式無法涵蓋整個螢幕,最後還是必須透過 Windows API 將 Windows 設定成和視窗一樣大小。先利用 GetSystemMetrics(SM_CYSCREEN) 和 GetSystemMetrics(SM_CXSCREEN) 分別取得螢幕的寬和高,最後再透過 SetWindowsPos 將視窗設定成和螢幕等寬並且置於上層
SetWindowPos(hwnd, HWND_TOP, 0, 0,
GetSystemMetrics(SM_CYSCREEN),
GetSystemMetrics(SM_CXSCREEN), SWP_SHOWWINDOW);
參考資料
[1] Full Screen Mode in C#
[2] Form.FormBorderStyle 屬性(System.Windows.Forms)
[3] Form.WindowState 屬性(System.Windows.Forms)
[4] Form.TopMost 屬性(System.Windows.Forms)
[5] Full Screen Video Display
[6] How to make Windows Form app truly Full Screen (and to hide Taskbar) in C#?
[7] How To Cover the Task Bar with a Window
星期五, 10月 05, 2007
跨執行緒作業無效
Answer:
private void ThreadTask()
{
//form2.Visible = true; //出現所使用的執行緒與建立控制項的執行緒不同
ShowForm(); //改用ShowForm()即可
}
private void ShowForm()
{
if (form2.InvokeRequired)
form2.Invoke(new MethodInvoker(ShowForm)); //此ShowForm為delgete型態,即傳Method Name
else
form2.Visible = true;
}
*如果要傳值的話...
以傳string為例,先自行定義delegate
delegate void mydel(string str);
...
//呼叫ShowForm()+傳值
ShowForm("oh ya~")
private void ShowForm(string str)
{
if form2.InvokeRequired)
this.Invoke(new mydel(ShowForm), new object[] { str});
else
this.title =(string)obj[0];
}
注意:如果傳的值是物件的話,得clone新的物件
例:上例
delegate void mydel(Object [] args);
...
//呼叫ShowForm()+傳值
ShowForm( new Object[1])
private void ShowForm(Object [] args)
{
if (this.InvokeRequired)
this.Invoke(a, args.clone()); //clone一個新的
...
}
*較簡單的方法 (轉)
在form_load時加一行
ListBox.CheckForIllegalCrossThreadCalls = False
這樣就會關閉所有listbox的檢查是否為不合法的跨執行緒存取
從vs2005開始, 所有windows form控制項, 都多了一個[能否任意跨執行緒變更屬性]的靜態屬性
這是為了防止控制項在多執行緒情況下工作時, 同時有多個執行緒存取單一控制項, 導致程式發生死結
所以如果要跨執行緒存取控制項, 必須使用Control.Invoke的方法, 來變更控制項目前的屬性,
如果覺得這樣做太麻煩, 而且您自己確定, 不會發生死結
星期三, 10月 03, 2007
Ubuntu Adjustment
1.1 安裝嘸蝦米
1.2 輸入法微調
2:配置X預設輸入法,在/etc/X11/Xsession.d/95xinput-set中加入:
export XMODIFIERS=@im=SCIM
scim -d
2.Samba
apt-get install
3.影音
3.1 SMplayer
下載網頁: http://wesley.debianbox.be/packages/
"推薦的原因,簡單說,他讓Un*x 下,看影片的過程變輕鬆了!不再需要跟一堆設定檔案奮鬥。讓已經很好設定的 Mplayer 更簡單。該有的功能他都有了,而且還有一點我很喜歡。當你一部影片看到一半,關掉了,不管你這之間看過什麼,下次再開,他會從你關掉、暫停的位置繼續。 PowerDVD 也有這個功能,不過 Un*x 上,還是首見! 而這個新版,又有什麼新特色呢?繁體中文沒問題了!佈景主題沒問題了!鍵盤 HotKey 沒問題了。真的很不錯!真心地再推薦一次!
設定的重點,主要是字幕部分,選擇一個喜歡的字型,然後編碼選 Big5,這樣就可以了。 "
下載網頁裡分別有包給Ubuntu 7.04,6.10,6.06使用的deb檔
SMPlayer deb檔分為Qt3沒有KDE支援,以及Qt3有KDE支援,另外還有額外佈景/圖示套件
3.2 支援realplayer
如果此時有出現「有影無聲」的情形可用下列的方式修正。
可以編輯~/.xine/catalog.cache文件,找到
[/usr/lib/xine/plugins/1.1.4/xineplug_decode_real_audio.so]
把 decoder_priority 增加到 10,至此大功告成,可以好好享受用 totem-xine 來看 rmvb 囉!
4. Office
4.1pdf中文亂碼
5. Gaim
5.1自訂圖示
在~/.gaim/smileys/下 建目錄放表情圖示
放完圖示後,在此目錄下建立名為“theme”文字檔
內容為
-----
Name=(圖示名稱)
Description=(說明)
Icon=angry.gif //---這個是註解不要加,此行是設定這個圖示集的代表符號
Author=none
/*---這段是註解不要加…
以下的格式,就是圖檔對應按鍵符號,可以用 tab 隔開也可用 space 隔開
可定義多個按鍵對應一個圖示
*/
[default]
angry.gif (><)
applaud.gif (applaud)
blank.gif (b) (B)
6. rar for linux
7.重裝OpenOffice
下載完畢後先解壓縮
$tar zvxf OOF680_m14_native_packed-1_zh-TW.9135.tar.gz
移除本來的OpenOffice
$sudo apt-get autoremove openoffice.org-core
開始安裝載來的OpenOffice
$cd OOF680_m14_native_packed-1_zh-TW.9135/DEBS
$sudo dpkg -i *.deb
建立選單捷徑
可以用滑鼠去執行desktop-integration/openoffice.org-debian-menus_2.2-9119_all.deb
可以看到所有依賴關係都已滿足或者用指令安裝
$sudo dpkg -i desktop-integration/openoffice.org-debian-menus_2.2-9119_all.deb
整個安裝過程就完畢了,執行一下看看吧,建立使用者資料後就可以用了
Logo也恢復為原來的藍色了,播個投影看看,果然不會再當掉了
UML學習筆記
●Funcation View (系統應該如何運作)
1.Use case diagram =>使用案例圖描述使用者期待系統提供的特性。
系統應該提供什麼。需求功能被視為目標。再以narrative來補充,以描述各使用案例被期待完成什麼,以達到各目標。
2.Activity diagram =>描述包括連續任務、條件邏輯及一致性的程序。
利用活動圖繪製邏輯。也可用來評估應用程式的複雜度,細節複雜時,如果用活動圖畫出來,將使邏輯變好懂。
●Static View (藍圖及關係)
1.Class diagram (general )
2.Object diagram (concrete)
●Dynamic view (互動、狀態改變)
1.Squence (互動)
2. collaboration (互動)
3. statechart(object如何與外剖刺激互動,並管理內部改變)
rar for linux
不是免費的;可從http://www.rarsoft.com/download.htm下載RAR for Linux 3.2.0,然後安裝:
# tar -xzpvf rarlinux-3.2.0.tar.gz
# cd rar
# make
這樣就安裝好了,安裝後就有了rar和unrar這兩個程式,rar是壓縮程式,unrar是解壓程式。它們的參數選項很多,這裏只做簡單介紹,依舊舉例說明一下其用法:
# rar a all *.jpg
這條命令是將所有.jpg的檔壓縮成一個rar包,名為all.rar,該程式會將.rar 副檔名將自動附加到包名後。
# unrar e all.rar
這條命令是將all.rar中的所有檔解壓出來
星期一, 10月 01, 2007
Google Weather API
This is a little guide on how to use the Google Weather API
Use this XML file for output in Fahrenheit:
http://www.google.com/ig/api?weather=Drammen //華氏 (ex. Taipei)
And this one for Celsius:
http://www.google.co.uk/ig/api?weather=Drammen //攝氏 (ex. Taipei)
And here is the sample C# parser (Celsius Version):
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Net;
///Code by Roman Alifanov - API by Google
///Posted on http://animaonline.blogspot.com
namespace GoogleWeatherAPI_Parser
{
class Program
{
static void Main(string[] args)
{
int i = 0;
//SelectNodes("xml_api_reply/weather/current_conditions")
//↑其中字串為指定哪個node,參考回傳的xml即可瞭解
XmlNodeList GWP_NodeList = GoogleWeatherAPI_Parser(@"http://www.google.co.uk/ig/api?weather=Drammen").SelectNodes("xml_api_reply/weather/current_conditions");
Console.WriteLine("Current weather in Drammen: " + GWP_NodeList.Item(i).SelectSingleNode("temp_c").Attributes["data"].InnerText);
Console.ReadLine();
}
private static XmlDocument GoogleWeatherAPI_Parser(string baseUrl)
{
HttpWebRequest GWP_Request;
HttpWebResponse GWP_Response = null;
XmlDocument GWP_XMLdoc = null;
try
{
GWP_Request = (HttpWebRequest)WebRequest.Create(string.Format(baseUrl));
GWP_Request.UserAgent = @"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4";
GWP_Response = (HttpWebResponse)GWP_Request.GetResponse();
GWP_XMLdoc = new XmlDocument();
GWP_XMLdoc.Load(GWP_Response.GetResponseStream());
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
GWP_Response.Close();
return GWP_XMLdoc;
}
}
WebBrowser處理網頁元件attribute, style及event
ex.
//set htmlDoc
HtmlDocument htmlDoc = webBrowser1.Document;
//set Element where tag's name is "Name"
HtmlElement tbUserid = htmlDoc.All["Name"];
HtmlElement tbPasswd = htmlDoc.All["Nickname"];
//set the content of tag's attribute "value"
tbUserid.SetAttribute("value", "Kevin");
tbPasswd.SetAttribute("value", "ok1234");
//get the content
String name = tbUserid.GetAttribute("value");
p.s 某些tag無法用name取得,只能用id來取得
2.設定或取得html tag的文字
例
同上取得HtmlElement後
HtmlElement tmp = htmlDoc.All["wellcomeTag"];
tmp.SetInnerHtml("you got it") //set
tmp.GetInnerHtml() //get
p.s document如果為XML的話,得用InnerText (好像吧 哈)
3.改變Style
同上取得HtmlElement後
tmp.Style = "display: none";
4.增加onclick事性
HtmlElement imgElement1 = htmlDoc.All["PlayBall"];
if (imgElement1 != null)
{
imgElement1.AttachEventHandler("onclick", new EventHandler(imgElement1_Click));
}
//click event
private void imgElement1_Click(object sender, EventArgs e)
{
listBox1.Items.Add("let's have some fun");
}
將影片轉成FLV格式
/*
* 利用ffmpeg轉換格式
* p.s 先下載ffmpeg.exe,並放置指定位置
*/
private void MPG2FLV_Load(object sender, EventArgs e)
{
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.EnableRaisingEvents = false;
proc.StartInfo.FileName = @"C:\edgar\mediaHandler\ffmpeg\ffmpeg";
proc.StartInfo.Arguments = "-i C:\\edgar\\mediaHandler\\ffmpeg\\1.mpg -ar 22050 -ab 32 -f flv -s 320×240 -aspect 4:3 -y movie4.flv";
/* use /y to overwrite if there it exists already or will fail */
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.CreateNoWindow = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.Start();
proc.WaitForExit();
proc.Close();
}
利用C#程式碼列印
* 為 PrintDocument 增加PrintPageEventHandler事件handler
*/
private void btnPrint_Click(object sender, EventArgs e)
{
PrintDocument printDoc = new PrintDocument();
printDoc.PrintPage += new PrintPageEventHandler(printDoc_PrintPage);
//if print() is invoked, the event printDoc_PrintPage will be called.
printDoc.Print();
}
public void printDoc_PrintPage(object sender, PrintPageEventArgs e)
{
Point ulCorner = new Point(300, 300);//location
e.Graphics.DrawImage(pictureBox1.Image, ulCorner);
}
在圖片上畫圖
/*
* 在圖片上畫路徑,最後利用pictureBox存檔
*/
1.先設定繪畫
String pictureFileName=@"C:\picture.jpg";
String saveFileName=@"C:\test.jpg";
//set grapthic tool on specific image
Graphics graphics = Graphics.FromImage(pictureFileName);
//set a path
GraphicsPath path;
path = new GraphicsPath(new Point[]{ new Point(285, 315),new Point(190, 150),new Point(85, 120), new Point(80, 60),new Point(95, 80)},
new byte[] {(byte)PathPointType.Start,(byte)PathPointType.Line,(byte)PathPointType.Line,(byte)PathPointType.Line,(byte)PathPointType.Line });
graphics.DrawPath(Pens.Blue, path);
//save the grpahic
graphics.Save(saveFileName);