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 空白鍵