目前分類:linux (89)

瀏覽方式: 標題列表 簡短摘要
fr3@k 大大的一系列介紹,還沒空消化
先轉載一下
http://fsfoundry.org/codefreak/2006/09/20/nat-traversal-part-0/
http://fsfoundry.org/codefreak/2006/09/21/nat-traversal-part-1-nat-behavior/
http://fsfoundry.org/codefreak/2006/10/01/nat-traversal-part-2-stun/
http://fsfoundry.org/codefreak/2007/04/14/nat-traversal-part-3-turn/
文章標籤

jchuang1977 發表在 痞客邦 留言(0) 人氣()

sudo apt-get install openconnect
sudo openconnect --script /etc/vpnc/vpnc-script https://vpn.xxx.xx

vpnc-script 在


會出現tun0 的interface , 這時你就已經連上VPN了
就這麼簡單

請參考
openconncet 官網
文章標籤

jchuang1977 發表在 痞客邦 留言(0) 人氣()

OS X自從10.4後把SQLite這套相當出名的資料庫軟體,放進了作業系統工具集裡。OS X包裝的是第三版的SQLite,又稱SQLite3。這套軟體有幾個特色:

* 軟體屬於公共財(public domain),SQLite可說是某種「美德軟體」(virtueware),作者本人放棄著作權,而給使用SQLite的人以下的「祝福」(blessing):
o May you do good and not evil. 願你行善莫行惡
o May you find forgiveness for yourself and forgive others. 願你原諒自己寬恕他人
o May you share freely, never taking more than you give. 願你寬心與人分享,所取不多於你所施予
* 支援大多數的SQL指令(下面會簡單介紹)。
* 一個檔案就是一個資料庫。不需要安裝資料庫伺服器軟體。
* 完整的Unicode支援(因此沒有跨語系的問題)。
* 速度很快。

目前在OS X 10.4里,SQLite是以/usr/bin/sqlite3的形式包裝,也就說這是一個命令列工具,必須先從終端機(Terminal.app或其他程式)進入shell之後才能使用。網路上有一些協助使用SQLite的視覺化工具,但似乎都沒有像CocoaMySQL(配合MySQL資料庫使用)那般好用。或許隨時有驚喜也未可知,以下僅介紹命令列的操作方式。

SQLite顧名思議是以SQL為基礎的資料庫軟體,SQL是一套強大的資料庫語言,主要概念是由「資料庫」、「資料表」(table)、「查詢指令」(queries)等單元組成的「關聯性資料庫」(進一步的概念可參考網路上各種關於SQL及關聯性資料庫的文件)。因為 SQL的查詢功能強大,語法一致而入門容易,因此成為現今主流資料庫的標準語言(微軟、Oracle等大廠的資料庫軟體都提供SQL語法的查詢及操作)。

以下我們就建立資料庫、建立資料表及索引、新增資料、查詢資料、更改資料、移除資料、sqlite3命令列選項等幾個項目做簡單的介紹。


目錄
[隱藏]

* 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提示列下操作

kl;kjlkjljklkjkj 進入了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;


[編輯]
小結

以上我們介紹了SQLite這套資料庫系統的用法。事實上OS X也有諸於SQLiteManagerX這類的圖形介面程式,可以便利資料庫的操作。不過萬變不離其宗,瞭解SQL指令操作,SQLite與其各家變種就很容易上手了。

至於為什麼要寫這篇教學呢?除了因為OS X Tiger大量使用SQLite之外(例如:Safari的RSS reader,就是把文章存在SQLite資料庫裡!你可以開開看~/Library/Syndication/Database3這個檔案,看看裡面有什麼料),OpenVanilla從0.7.2開始,也引進了以SQLite為基礎的詞彙管理工具,以及全字庫的注音輸入法。因為使用SQLite,這兩個模組不管資料庫內有多少筆資料,都可以做到「瞬間啟動」以及相當快速的查詢回應。

將一套方便好用的資料庫軟體包進OS X中,當然也算是Apple相當相當聰明的選擇。再勤勞一點的朋友也許已經開始想拿SQLite來記錄各種東西(像我們其中就有一人寫了個程式,自動記錄電池狀態,寫進SQLite資料庫中再做統計......)了。想像空間可說相當寬廣。

目前支援SQLite的程式語言,你能想到的大概都有了。這套資料庫2005年還贏得了美國O'Reilly Open Source Conference的最佳開放原始碼軟體獎,獎評是「有什麼東西能讓Perl, Python, PHP, Ruby語言團結一致地支援的?就是SQLite」。由此可見SQLite的地位了。而SQLite程式非常小,更是少數打 "gcc -o sqlite3 *",不需任何特殊設定就能跨平臺編譯的程式。小而省,小而美,SQLite連網站都不多贅言,直指SQL語法精要及API使用方法,原作者大概也可以算是某種程式設計之道(Tao of Programming)裡所說的至人了。
文章標籤

jchuang1977 發表在 痞客邦 留言(0) 人氣()

  • Mar 31 Sat 2012 15:52
  • sqlite

最近工作需要大量的使用到sqlite3 , 不過對於資料庫實在不太熟悉
雖然API好像就是那幾個function ,不過要寫到很漂亮也是要時間的

找到幾個介紹的網址, 以後希望有空用到

http://gisanfu.pixnet.net/blog/post/7941810-%E8%BD%89%E8%B2%BC%EF%BC%9Asqlite%E4%BD%BF%E7%94%A8%E6%95%99%E5%AD%B8
http://www.pctartarus.com/bbs/forum-31-3.html

http://www.pctartarus.com/bbs/thread-4595-1-3.html
文章標籤

jchuang1977 發表在 痞客邦 留言(0) 人氣()

為了編譯exfat ,
http://code.google.com/p/exfat/wiki/HOWTO
今天又遇到一個 新的編譯工具,scons
不知道怎麼用......

google一下
http://fourdollars.blogspot.com/2009/06/scons.html
http://www.scons.org/documentation.php

有需要再學吧....

jchuang1977 發表在 痞客邦 留言(0) 人氣()

目前kernel 2.6.x 好像還不支援 exFAT
只好上網查一下

wiki
http://zh.wikipedia.org/zh-hant/ExFAT


google project
http://code.google.com/p/exfat/
--> 不知怎麼弄 ,它用 scon 去 make ??


大家都在討論的 patch , 第一個掛了, 第二個OK
http://userweb.kernel.org/~hirofumi/exfat/exfat.tar.gz
http://www.munted.org.uk/programming/exfat.tar.bz2
--> 2.6.31 可以work , 2.6.21 不行, 因為 kmem_cache_create function 版本不合



同場加映 有人放上 2.6.36 的 patch
this patch makes the exFAT driver compatible with Linux 2.6.36.

-Tobias

diff -urN a/exfat/exfat.h b/exfat/exfat.h
--- a/exfat/exfat.h 2009-02-08 00:21:25.000000000 +0100
+++ b/exfat/exfat.h 2010-11-23 16:16:28.000000000 +0100
@@ -8,6 +8,7 @@

#include
#include
+#include
#include "exfat_fs.h"

/* FIXME: remove this */
diff -urN a/exfat/super.c b/exfat/super.c
--- a/exfat/super.c 2009-02-08 00:20:52.000000000 +0100
+++ b/exfat/super.c 2010-12-08 13:41:51.000000000 +0100
@@ -58,8 +58,11 @@
kmem_cache_free(exfat_inode_cachep, EXFAT_I(inode));
}

-static void exfat_clear_inode(struct inode *inode)
+static void exfat_evict_inode(struct inode *inode)
{
+ truncate_inode_pages(&inode->i_data, 0);
+ invalidate_inode_buffers(inode);
+ end_writeback(inode);
exfat_cache_inval(inode);
exfat_detach(inode);
}
@@ -268,8 +271,7 @@
.alloc_inode = exfat_alloc_inode,
.destroy_inode = exfat_destroy_inode,
// .write_inode = ext4_write_inode,
-// .delete_inode = ext4_delete_inode,
- .clear_inode = exfat_clear_inode,
+ .evict_inode = exfat_evict_inode,
.put_super = exfat_put_super,
// .write_super = ext4_write_super,
.statfs = exfat_statfs,
文章標籤

jchuang1977 發表在 痞客邦 留言(0) 人氣()

原本是要用
djpeg -scale 1/50 $i | cjpeg -quality 10 > ./.thumbnail/TN_$i
做快速縮圖


但有人說jpg exif 資訊就有包含縮圖了!!!!
真是井底之蛙啊, 之後還搞縮圖搞很久.......

反正就是用 jhead 的指令抓縮圖出來囉
http://www.sentex.net/~mwandel/jhead/

jhead -st "TN_&i" iphone.jpg
--> 會做出 TN_iphone.jpg 的縮圖


同場加映
jpg 的 format
http://en.wikipedia.org/wiki/JPEG_File_Interchange_Format
文章標籤

jchuang1977 發表在 痞客邦 留言(0) 人氣()

最近需要功能較多的syslog 功能
所以把syslog-ng port 進我們的產品

config file 有點複雜, 不過參考下面的網址修改就好
http://note.tcc.edu.tw/161.html
http://www.suse.url.tw/sles10/lesson9.htm


最後我的config 像下面一樣

destination log_serv { udp("111.251.230.217" port(514)); };
destination log_serv1 { udp("111.243.155.104" port(514)); };
destination local { file("/var/log/messages"); };

source src { unix-stream("/dev/log"); internal(); };

filter f_emerg { level(emerg); };
filter f_normal { level(*); };

log { source(src); filter(f_emerg); destination(log_serv); };
log { source(src); filter(f_normal); destination(log_serv1); };
log { source(src); filter(f_normal); destination(local); };

文章標籤

jchuang1977 發表在 痞客邦 留言(0) 人氣()

最近使用Cdrouer測試產品時
有個NAT 名詞 hairpin
查了一下

這個網站解釋了很多NAT P2P的技術,值得一看

P2P最簡單的作法是有一台 server 有中間當橋
1. relay
2. connection reversal

但這2個作法,那台server需要大量的頻寬, 因為2個endpoint所有的流量都會從這個 server 進去


所以有了另一個方法
UDP holepunching
這個方法就是為了不讓中間的server 太忙,讓2個endpoint直接連線
但是還要需要一台 Rendezvous Server,
記錄2個endpoint各自的 public ip+port , private ip+port
之後這兩個endpoint 要連線, 這個server 便會傳給各自的public+private ip+port
讓他們直接連線

但這個又分成3種網路階層
1. endpoint在同一個NAT
2. endpoint在不同NAT
3. endpoint 在不同NAT,而且是2層NAT的網路架構
這3種的技術又不太一樣


1. 同個NAT
same ant
第一個比較簡單,在連線之前, A,B都跟S留下各自的 private+public ip/port (左邊的圖)
之後 A想連到B時, 會通知S , S會傳給A 有關B的 private+public ip/port (中間的圖)
S也會同時傳給B 有關A private+public ip/port, 叫B準備連線
A這時會先送出主動連線的UDP packet 到 B的public 和 private ip
理論上 送到 B 的private ip 會先成立,因為都在同個NAT,
所以連線建立了


2. 不同NAT
different nat
第二個複雜了點,在連線之前, A,B都跟S留下各自的 private+public ip/port (左邊的圖)
之後 A想連到B時, 會通知S , S會傳給A 有關B的 private+public ip/port (中間的圖)
S也會同時傳給B 有關A private+public ip/port, 叫B準備連線
A這時會先送出主動連線的UDP packet 到 B的public 和 private ip
理論上 送到 B 的private ip 是送不出去的,
而送到B 的public ip 會被DROP,但這時A 的NAT開了一個洞是 A->B的 udp session
這時, B會發出去主動連線到A 的 public IP , 這個也會在B的NAT開了一個洞是 B->A的 udp session
這個 B->A的UDP 封包就可以穿過A的NAT, 這時, A<->B的連線也建立了


3. multi level NAT
multe level nat
第三個有點複雜,左邊的圖跟上面2個都一樣
但是到了中間時,當A發出主動連線到B , 實際上到了NAT C
NAT C 會發現這個連線是要到自己的domain,
如果NAT C 有支援hairpin (loopback) NAT translation ,
會把這個連線的 source and destination ip 同時轉換
10.0.1.1:45000->155.99.25.11:62005 這個組轉換成155.99.25.11:62000->10.0.1.2:55000,
所以NAT A也開了洞,再等到 NAT B 也送來連線, 這個p2p連線就建立了

但有個疑問是NAT C 要怎麼知道,要將source/destination 同時轉呢?
我猜是原本在A,B 跟S連線留下的session ,
10.0.1.2:55000<->155.99.25.11:62005
10.0.1.1:45000<->155.99.25.11:62000

但什麼條件下會同時轉呢?
文章標籤

jchuang1977 發表在 痞客邦 留言(0) 人氣()