標籤

4GL (1) 人才發展 (10) 人物 (3) 太陽能 (4) 心理 (3) 心靈 (10) 文學 (31) 生活常識 (14) 光學 (1) 名句 (10) 即時通訊軟體 (2) 奇狐 (2) 爬蟲 (1) 音樂 (2) 產業 (5) 郭語錄 (3) 無聊 (3) 統計 (4) 新聞 (1) 經濟學 (1) 經營管理 (42) 解析度 (1) 遊戲 (5) 電學 (1) 網管 (10) 廣告 (1) 數學 (1) 機率 (1) 雜趣 (1) 證券 (4) 證券期貨 (1) ABAP (15) AD (1) agentflow (4) AJAX (1) Android (1) AnyChart (1) Apache (14) BASIS (4) BDL (1) C# (1) Church (1) CIE (1) CO (38) Converter (1) cron (1) CSS (23) DMS (1) DVD (1) Eclipse (1) English (1) excel (5) Exchange (4) Failover (1) Fedora (1) FI (57) File Transfer (1) Firefox (3) FM (2) fourjs (1) Genero (1) gladiatus (1) google (1) Google Maps API (2) grep (1) Grub (1) HR (2) html (23) HTS (8) IE (1) IE 8 (1) IIS (1) IMAP (3) Internet Explorer (1) java (4) JavaScript (22) jQuery (6) JSON (1) K3b (1) ldd (1) LED (3) Linux (117) Linux Mint (4) Load Balance (1) Microsoft (2) MIS (2) MM (51) MSSQL (1) MySQL (27) Network (1) NFS (1) Office (1) OpenSSL (1) Oracle (126) Outlook (3) PDF (6) Perl (60) PHP (33) PL/SQL (1) PL/SQL Developer (1) PM (3) Postfix (2) postfwd (1) PostgreSQL (1) PP (50) python (5) QM (1) Red Hat (4) Reporting Service (28) ruby (11) SAP (234) scp (1) SD (16) sed (1) Selenium (3) Selenium-WebDriver (5) shell (5) SQL (4) SQL server (8) sqlplus (1) SQuirreL SQL Client (1) SSH (2) SWOT (3) Symantec (2) T-SQL (7) Tera Term (2) tip (1) tiptop (24) Tomcat (6) Trouble Shooting (1) Tuning (5) Ubuntu (37) ufw (1) utf-8 (1) VIM (11) Virtual Machine (2) VirtualBox (1) vnc (3) Web Service (2) wget (1) Windows (19) Windows (1) WM (6) Xvfb (2) youtube (1) yum (2)

2011年9月30日 星期五

Perl & Sqlite3

1. Set up your sqlite database file

sqlite3 demo.db SQLite version 3.6.13 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> create table datas (         id integer,         name text,         date text ); 

2. Execute simple operations with perl

#!/usr/bin/perl  # Import needed Modules use DBI; use strict;  # Connection to DB file created before my $dbh = DBI->connect("dbi:SQLite:dbname=demo.db","","",$dbargs);  # Two simple insert Queries  # I use ->do as I don't need to do anything with returned obj $dbh->do("insert into `datas` (id, name,date) values (1,'something','1986-06-07')"); $dbh->do("insert into `datas` (id, name,date) values (2,'otherthing','2009-03-02')");  # A simple select statement my $query = "SELECT * FROM datas ORDER BY id DESC"; my $query_handle = $dbh->prepare($query); $query_handle->execute();  # Instead of simply fetching rows I prefer, for each one, # to assign values to predefinite values. # Bind columns is a wonderful function! $query_handle->bind_columns(\my($id, $name, $date)); while($query_handle->fetch()) {    print "$id, $name, $date \n" }  # Close connection $query_handle->finish; undef($dbh);  

各大ISP DNS SERVER IP

Hinet DNS
  • 主 DNS:168.95.1.1
  • 次 DNS:168.95.92.1
So-net DNS
  • 主 DNS:61.64.127.1
  • 次 DNS:61.64.127.2
Seednet DNS
  • 主 DNS:139.175.55.244
  • 次 DNS:139.175.252.16
GIGA-Net DNS
  • 主 DNS:203.133.1.6
  • 次 DNS:203.187.0.6

2011年9月29日 星期四

掃描IP範圍的個別電腦服務port nmap

nmap -PN 10.56.40.48
nmap -PN 10.56.40.40-48 --no ping
nmap -sL 10.56.40.40-48 --List Scan - simply list targets to scan

nmap -sL 10.56.40.* | grep xxx.com.tw -- list網路內IP <-> hostname 對應
nmap -PI 10.56.34.* | grep "Interesting ports" -- list網路內IP <-> hostname 對應

2011年9月27日 星期二

sqlite3 介紹

http://www.sqlite.com.cn/MySqlite/4/378.Html

SQLite3 使用教学

作者:tamsyn 来源:www.sqlite.com.cn 时间:2007-3-16 【 字体: 〖 双击滚屏 〗



OS X自从10.4后把SQLite这套相当出名的数据库软件,放进了作业系统工具集里。OS X包装的是第三版的SQLite,又称SQLite3。这套软件有几个特色:

  • 软件属于公共财(public domain),SQLite可说是某种「美德软件」(virtueware),作者本人放弃着作权,而给使用SQLite的人以下的「祝福」(blessing):
    • May you do good and not evil. 愿你行善莫行恶
    • May you find forgiveness for yourself and forgive others. 愿你原谅自己宽恕他人
    • 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.db 

如果目录下没有foo.db,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的字段可以储存任何东西:文字、数字、大量文字(blub),它会在适时自动转换。


建立索引

如果资料表有相当多的资料,我们便会建立索引来加快速度。好比说:

create index film_title_index on film(title); 

意思是针对film资料表的name字段,建立一个名叫film_name_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; 

或是照着电影年份来排列:

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)里所说的至人了。

Enjoy /usr/bin/sqlite3 in your OS X Tiger. :)

firefox 在ubuntu很慢的解決方式

1. for f in ~/.mozilla/firefox/*/*.sqlite; do sqlite3 $f 'VACUUM;'; done
2.首先在網址列打上about:config
進去之後搜尋network.dns.disableIPv6
並且按兩下讓他的值變成真的
這樣可以關掉ipv6

2011年9月26日 星期一

apt-get 設定檔

/etc/apt/sources.list

自動update apt-get

29 1 * * * apt-get update;apt-get -y upgrade;apt-get autoclean > /tmp/apt-get.log 2>&1

synch 系統時間

/usr/sbin/ntpdate server

example : 59 12,23 * * * /usr/sbin/ntpdate aot-dc02 > /tmp/adjust.log 2>&1

Perl : 寄出中文

#! /usr/bin/perl

require "$ENV{HOME}/perl/setEnv.pl";
use Mail::Sendmail;
use Encode;
use MIME::Base64;

$ENV{LANG} = "zh_TW.Big5";

&main();

sub main {
&mailAlert();
}


sub mailAlert {
my $subject = "提醒,別忘了每月UPS溫度檢測";
my $message = "如題";
my %mail = (
From => 'xxx',
To => "zzz",
Subject => $subject
);
$mail{smtp} = "$smtp";

$message = qq {"如題"};

$boundary = "====" . time() . "====";
$mail{'content-type'} = "multipart/mixed; boundary=\"$boundary\"";

$boundary = '--'.$boundary;
$mail{body} = &lt&ltEND_OF_BODY;
$boundary
Content-Type: text/plain; charset="big5"
Content-Transfer-Encoding: quoted-printable

$message
$boundary

$mail{body}
$boundary--
END_OF_BODY

sendmail %mail;
}

2011年9月25日 星期日

linux wget 抓取 网站网页

http://www.justwinit.cn/post/4593/

wget 是一个命令行的下载文件工具,它支持HTTP,HTTPS和FTP协议,可以使用HTTP代理。Linux用户经常需要使用它。下此介绍几个wget使用的技巧。
wget技巧大全:
1>下载 http://www.linux.com 网站上 packs 目录中的所有文件
$ wget -r -np -nd http://www.linux.com/packs/
-np 的作用是不遍历父目录
-nd 表示不在本机重新创建目录结构。

2>下载整个http或者ftp站点
$ wget -r -x http://www.linux.com
-x 的作用强制建立服务器上一模一样的目录
这个命令会按照递归的下载服务器上所有的目录和文件,就是下载整个网站。在下载的时候,被下载网站指向的所有地址都会被下载,如果这个网站引用了其他网站,被引用的网站也会被下载下来!!!
注意: 可以用-l number参数来指定下载的层次。例如只下载两层,那么使用-l 2。
如: wget -r -x -l 2 http://www.linux.com

3>wget选择性的只下载某类文件
$ wget -r -np -nd –accept=iso http://www.linux.com/i386/
–accept=iso 选项,这指示wget仅下载 i386 目录中所有扩展名为 iso 的文件。你也可以指定多个扩展名,只需用逗号分隔即可。

4>批量下载
wget -i downloads.txt
如果有多个文件需要下载,那么把所有需要下载文件的地址放到downloads.txt中(每个文件的URL写一行),然后 wget 就会自动为你下载所有文件了。

5>断点续传
$ wget -c -t 100 -T 120 http://www.linux.com/big-file.iso
当文件特别大或者网络特别慢的时候,往往一个文件还没有下载完,连接就已经被切断,此时就需要断点续传。wget的断点续传是自动的。
-c 选项的作用为断点续传。
-t 参数表示重试次数(例如需要重试100次,那么就写-t 100,如果设成-t 0,那么表示无穷次重试,直到连接成功。)
-T 参数表示超时等待时间,例如-T 120,表示等待120秒连接不上就算超时。

6>镜像一个网站
$ wget -m -k (-H) http://www.linux.com/
如果网站中的图像是放在另外的站点,那么可以使用 -H 选项。

2011年9月24日 星期六

管理階層的工作目標

  1. 完成任務
  2. 準時
  3. 在預算內
  4. 成果令人滿意
  5. 運用現有的資源

如何做
  1. 規劃 : 規劃公司的近程及遠程目標
  2. 組織 : 決定如何使用資源
  3. 招募
  4. 指導 : 指導員工完成他們的工作
  5. 控管 : 監控工作進度朝著目標邁進

2011年9月20日 星期二

Oracle flashback

http://blog.roodo.com/mywork/archives/1684525.html

Oracle Flashback

Oracle Flashback Database特性允許通過SQL語句Flashback Database語句,讓數據庫前滾到當前的前一個時間點或者SCN,而不需要做時間點的恢復。flashback可以迅速將數據庫回到誤操作或人為錯誤 的前一個時間點,可減少解決問題所花費的時間。

OS:windows 2000
Oracle:10g
跟flashback有關的參數:

開起flashback語法
SQL>alter database flashback on;


查看放flash空間的地方和容量
SQL> show parameter recover;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string D:\oracle\product\10.2.0/flash_recovery_area
db_recovery_file_dest_size big integer 2G
note:(修改大小值,容量大小跟flahsback的時間有關係)
SQL> alter system set db_recovery_file_dest_size=3G;
System altered

SQL> show parameter db_recovery_file_dest_size;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest_size big integer 3G


建立測試帳號
SQL> create user flashtest identified by flashtest;
已建立使用者.

SQL> grant connect,resource to flashtest;
順利授權.

SQL> grant execute on dbms_flashback to flashtest;
順利授權.

SQL> grant dba to flashtest;
順利授權.

SQL> conn flashtest/flashtest;
已連線.



flashback drop

建立測試table
SQL> create table testdrop7(id number);
Table created

建立幾筆資料
SQL> insert into testdrop7 values (1);
1 row inserted

SQL> insert into testdrop7 values (2);
1 row inserted

SQL> commit;
Commit complete

SQL> drop table testdrop7;
Table dropped

查尋回收區是否有剛被刪除的資料
SQL> select object_name,original_name,operation,type,droptime from recyclebin;

OBJECT_NAME ORIGINAL_NAME OPERATION TYPE DROPTIME
------------------------------ ---------------------- ------------------------- ------------------- ---------------------
BIN$4ltRoED1RaCHZglxktu9kA==$0 TESTDROP DROP TABLE 2006-05-29:17:07:48
BIN$V9qmi5hUQDKcTBMbfJkk5A==$0 TESTDROP2 DROP TABLE 2006-05-29:17:43:37
BIN$0SEStB60QhC4+hULXLkNOA==$0 TESTDROP3 DROP TABLE 2006-05-29:17:51:58
BIN$rezTtmaDQ9qn2jJEy28jdg==$0 TESTDROP4 DROP TABLE 2006-05-29:17:59:05
BIN$WXp0b1+7Qfea9YaMLw8aHA==$0 TESTDROP6 DROP TABLE 2006-05-29:18:23:16
BIN$A2ADdSwnRX2Ib5CXFe1iuQ==$0 TESTDROP5 DROP TABLE 2006-05-29:18:23:18
BIN$7lPg3xr3RFyemQ5cmCq6KA==$0 TESTDROP7 DROP TABLE 2006-05-30:12:08:34
7 rows selected


救回剛才被誤殺的table
SQL> flashback table testdrop7 to before drop ;
Done
note:
如有相同的table名字的話,可改用下面語法
flashback table "BIN$A2ADdSwnRX2Ib5CXFe1iuQ==$0" to before drop;

查尋是否真的救回來了
SQL> select * from testdrop7;
ID
----------
1
2


Flashback Table

以時間回覆:
先開起table的flashback的功能
SQL> alter table testdrop7 enable row movement;
Table altered
note:如沒有做這行的話,會出現錯誤訊習
ORA-08189: 未啟用資料列移動, 因此無法倒溯表格

現在testdrop7裡有5筆資料
SQL> select * from testdrop7;

ID
----------
1
2
3
4
5

增加二筆資料
SQL> insert into testdrop7 values (6);
1 row inserted

SQL> insert into testdrop7 values (7);
1 row inserted

SQL> commit;
Commit complete


查尋一下現在時間
SQL> select to_char(sysdate,'YYYY-MM-DD hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YYYY-MM-DDHH2
------------------------------
2006-05-30 14:21:43

再增一筆資料準備測試還原
SQL> insert into testdrop7 values (8);
1 row inserted

SQL> commit;
Commit complete

現在的時間
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YYYY-MM-DDHH2
------------------------------
2006-05-30 14:22:53

還原整個table到未加到數字8之前的狀態
SQL> flashback table testdrop7 to timestamp to_timestamp('2006-05-30 14:21:43','yyyy-mm-dd hh24:mi:ss');
Done

確時還原了
SQL> select * from testdrop7;

ID
----------
1
2
3
4
5
6
7

7 rows selected


以scn值回覆

查尋現在testdrop7裡的資料
SQL> select * from testdrop7;

ID
----------
1
2
3
4
5
6
7

7 rows selected

假裝誤刪一筆資料,並且commit了
SQL> delete from testdrop7 where id =7;
1 row deleted

SQL> commit;
Commit complete

現在testdrop7裡確時只有6筆了
SQL> select * from testdrop7;

ID
----------
1
2
3
4
5
6

6 rows selected

有關scn值就是記錄在這個table裡
SQL> desc flashback_transaction_query;
Name Type Nullable Default Comments
---------------- -------------- -------- ------- -----------------------------------------
XID RAW(8) Y Transaction identifier
START_SCN NUMBER Y Transaction start SCN
START_TIMESTAMP DATE Y Transaction start timestamp
COMMIT_SCN NUMBER Y Transaction commit SCN
COMMIT_TIMESTAMP DATE Y Transaction commit timestamp
LOGON_USER VARCHAR2(30) Y Logon user for transaction
UNDO_CHANGE# NUMBER Y 1-based undo change number
OPERATION VARCHAR2(32) Y forward operation for this undo
TABLE_NAME VARCHAR2(256) Y table name to which this undo applies
TABLE_OWNER VARCHAR2(32) Y owner of table to which this undo applies
ROW_ID VARCHAR2(19) Y rowid to which this undo applies
UNDO_SQL VARCHAR2(4000) Y SQL corresponding to this undo

查尋最後的scn值為何
SQL> select start_scn,
to_char(start_timestamp,'yyyy-mm-dd hh24:mi:ss') as s_time,
commit_scn,
to_char(commit_timestamp,'yyyy-mm-dd hh24:mi:ss') as c_time,
table_name,
undo_sql
from flashback_transaction_query
where table_name='TESTDROP7'
order by commit_timestamp;

START_SCN S_TIME COMMIT_SCN C_TIME TABLE_NAME UNDO_SQL
--------------- ------------------------- ------------------ --------------------- ------------- -----------------------------------
680553 2006-05-30 12:32:05 680731 2006-05-30 12:32:08 TESTDROP7 delete from "FLASHTEST"."TESTDROP7" where ROWID = 'AAAM1tAAEAAAAHNAAC';
685412 2006-05-30 14:04:47 685415 2006-05-30 14:04:53 TESTDROP7 delete from "FLASHTEST"."TESTDROP7" where ROWID = 'AAAM1tAAEAAAAHNAAE';
685412 2006-05-30 14:04:47 685415 2006-05-30 14:04:53 TESTDROP7 delete from "FLASHTEST"."TESTDROP7" where ROWID = 'AAAM1tAAEAAAAHNAAD';
686429 2006-05-30 14:20:51 686432 2006-05-30 14:20:57 TESTDROP7 delete from "FLASHTEST"."TESTDROP7" where ROWID = 'AAAM1tAAEAAAAHNAAG';
686429 2006-05-30 14:20:51 686432 2006-05-30 14:20:57 TESTDROP7 delete from "FLASHTEST"."TESTDROP7" where ROWID = 'AAAM1tAAEAAAAHNAAF';
686506 2006-05-30 14:22:25 686507 2006-05-30 14:22:25 TESTDROP7 delete from "FLASHTEST"."TESTDROP7" where ROWID = 'AAAM1tAAEAAAAHNAAH';
686574 2006-05-30 14:24:00 686576 2006-05-30 14:24:00 TESTDROP7 delete from "FLASHTEST"."TESTDROP7" where ROWID = 'AAAM1tAAAAAAAAJGg+';
686574 2006-05-30 14:24:00 686576 2006-05-30 14:24:00 TESTDROP7 insert into "FLASHTEST"."TESTDROP7"("ID") values ('8');
686574 2006-05-30 14:24:00 686576 2006-05-30 14:24:00 TESTDROP7 insert into "FLASHTEST"."TESTDROP7"("ID") values ('7');
686963 2006-05-30 14:31:58 686965 2006-05-30 14:32:01 TESTDROP7 insert into "FLASHTEST"."TESTDROP7"("ID") values ('7');
10 rows selected

現在table還沒有數值7
SQL> select * from testdrop7;

ID
----------
1
2
3
4
5
6

6 rows selected

輸入最後的scn值,進行還原
SQL> flashback table testdrop7 to scn 686963;
Done

SQL> select * from testdrop7;

ID
----------
1
2
3
4
5
6
7

7 rows selected


Flash Version Query
Oracle Flashback Version Query特性,利用保存的回滾信息,可以看到特定的表在時間段內的任何修改,如電影的回放一樣,可以了解表在該期間的任何變化

建立測試用table
SQL> create table testdrop10 (id number,text varchar(10));

Table created

新增測試資料
SQL> insert into testdrop10 values (1,'a');
1 row inserted

SQL> commit;
Commit complete

查尋一下現在時間跟scn值,以利後面查尋方便
SQL> select current_scn,to_char(systimestamp,'YYYY-MM-DD HH24:MI:SS') from v$database;

CURRENT_SCN TO_CHAR(SYSTIMESTAMP,'YYYY-MM-
----------- ------------------------------
691931 2006-05-30 15:51:08

做一些dml的動作
SQL> update testdrop10 set text='b' where id=1;
1 row updated

SQL> commit;
Commit complete

SQL> delete testdrop10 where id=1;
1 row deleted

SQL> commit;
Commit complete

SQL> insert into testdrop10 values (1,'c');
1 row inserted

SQL> commit;
Commit complete


SQL> SELECT versions_startscn,to_char(versions_starttime,'hh24:mi:ss') as s_time,
2 versions_endscn,to_char(versions_endtime,'hh24:mi:ss') as e_time,
3 versions_xid, versions_operation,
4 text
5 FROM testdrop10
6 VERSIONS BETWEEN TIMESTAMP
7 TO_TIMESTAMP('2006-05-30 15:51:08', 'YYYY-MM-DD HH24:MI:SS')
8 AND TO_TIMESTAMP('2006-05-30 15:53:30', 'YYYY-MM-DD HH24:MI:SS')
8 WHERE ID=1
9 ORDER BY versions_starttime;

VERSIONS_STARTSCN S_TIME VERSIONS_ENDSCN E_TIME VERSIONS_XID VERSIONS_OPERATION TEXT
----------------- -------- --------------- -------- ---------------- ---------------------------- ----------
691964 15:51:58 691975 15:52:13 060016007A010000 U b
691975 15:52:13 0A00250079010000 D b
691992 15:52:40 0400240078010000 I c
691964 15:51:58 a


note:如時間亂打的話會出現下面錯誤
SQL> SELECT versions_startscn,to_char(versions_starttime,'hh24:mi:ss') as s_time,
2 versions_endscn,to_char(versions_endtime,'hh24:mi:ss') as e_time,
3 versions_xid, versions_operation,
4 text
5 FROM testdrop10
6 VERSIONS BETWEEN TIMESTAMP TO_TIMESTAMP('2006-05-30 15:51:08', 'YYYY-MM-DD HH24:MI:SS')
7 AND TO_TIMESTAMP('2006-05-30 15:54:00', 'YYYY-MM-DD HH24:MI:SS')
8 WHERE ID=1
9 ORDER BY versions_starttime;

SELECT versions_startscn,to_char(versions_starttime,'hh24:mi:ss') as s_time,
versions_endscn,to_char(versions_endtime,'hh24:mi:ss') as e_time,
versions_xid, versions_operation,
text
FROM testdrop10
VERSIONS BETWEEN TIMESTAMP TO_TIMESTAMP('2006-05-30 15:51:08', 'YYYY-MM-DD HH24:MI:SS')
AND TO_TIMESTAMP('2006-05-30 15:54:00', 'YYYY-MM-DD HH24:MI:SS')
WHERE ID=1
ORDER BY versions_starttime

ORA-08186: 指定的時戳無效


Flashback Transaction Query

在上線的環境中是不可能去追 蹤每個事務,想要獲得已提交事務的XID,可由Flashback Version Query或直接查尋flashback_transaction_query這個table。

SQL> select * from testdrop10;


ID TEXT
---------- ----------
1 c

SQL> delete from testdrop10 where id=1;
1 row deleted

在commit之前先查一下xid值
SQL> select xid from v$transaction;
XID
----------------
0500180092010000

SQL> commit;
Commit complete

SQL> select undo_sql from flashback_transaction_query where xid='0500180092010000';
insert into "FLASHTEST"."TESTDROP10"("ID","TEXT") values ('1','c');

直接查尋flashback_transaction_query
SQL> desc flashback_transaction_query;
Name Type Nullable Default Comments
---------------- -------------- -------- ------- -----------------------------------------
XID RAW(8) Y Transaction identifier
START_SCN NUMBER Y Transaction start SCN
START_TIMESTAMP DATE Y Transaction start timestamp
COMMIT_SCN NUMBER Y Transaction commit SCN
COMMIT_TIMESTAMP DATE Y Transaction commit timestamp
LOGON_USER VARCHAR2(30) Y Logon user for transaction
UNDO_CHANGE# NUMBER Y 1-based undo change number
OPERATION VARCHAR2(32) Y forward operation for this undo
TABLE_NAME VARCHAR2(256) Y table name to which this undo applies
TABLE_OWNER VARCHAR2(32) Y owner of table to which this undo applies
ROW_ID VARCHAR2(19) Y rowid to which this undo applies
UNDO_SQL VARCHAR2(4000) Y SQL corresponding to this undo

SQL> select undo_sql from flashback_transaction_query where table_name='SYSDROP1';
delete from "SYS"."SYSDROP1" where ROWID = 'AAAM1sAABAAAO16AAB';
delete from "SYS"."SYSDROP1" where ROWID = 'AAAM1sAABAAAO16AAA';

2011年9月15日 星期四

asset value看法



data 存在ANLC
KANSW - 取得價值
KNAFA - 年初累積折舊
NAFAG - 目前折舊
NAFAP - 預計全年折舊
AFABE = '01' - Book Depreciation (本公司幣別)

Reporting Service : Tablix 在增加X軸欄位後,有時最右邊欄位部份空間會被截掉

解決方式:
1. 修改主體屬性Size
2. 修改報表屬性PageSize

原則上,只要2的PageSize.Width < 1的Size.Width;而且足夠長,則上述問題就會解決

2011年9月14日 星期三

張學良

不怕死 不愛錢
丈夫決不受人憐
頂天立地男兒漢
磊落光明度餘年

晚年台大演講


http://zh.wikipedia.org/zh-hant/%E5%BC%A0%E5%AD%A6%E8%89%AF

2011年9月10日 星期六

奔跑吧火狐 – 用 RAMDisk 來加速 Firefox -- Linux

把存取頻繁的 Cache 放到 RAMDisk 效果不知道如何?Linux 下的方法很簡單!
例如要放在 /tmp/cache、大小是 128Mb。編輯 /etc/fstab,加上:
tmpfs  /tmp/cache tmpfs  size=128M  0  0
然後建立 /tmp/cache:
sudo mkdir /tmp/cache
接著 mount 起來:
sudo mount -a
這樣就完成 RAMDisk 的建立了。 
接著打開 Firefox,在網址列輸入「about:config」
「右鍵」->「新增」->「字串」,名稱輸入「browser.cache.disk.parent_directory」,內容是你要放快取的地方,例如「/tmp/cache」。

2011年9月8日 星期四

如何知道Linux下擁有可用的disk(包含USB...)

tyruan@Ubuntu:~$ sudo fdisk -l

磁碟 /dev/sda: 1000.2 GB,1000204886016 位元組
255 磁頭,63 磁區/磁軌,121601 磁柱
單位 = 磁柱 之於 16065 * 512 = 8225280 位元組
磁區大小 (邏輯/實體):512 位元組 / 512 位元組
I/O 大小 (最小/最佳化):512 位元組 / 512 位元組
磁碟識別碼:0x000496cd

所用裝置 開機      開始         結束      區塊   識別號  系統
/dev/sda1   *           1          24      192748+  83  Linux
/dev/sda2              25      121601   976567222    5  延伸的
/dev/sda5              25      119655   960935976   83  Linux
/dev/sda6          119656      121601    15631213+  82  Linux 交換區/ Solaris

磁碟 /dev/sdb: 8199 MB,8199864320 位元組
233 磁頭,4 磁區/磁軌,17183 磁柱
單位 = 磁柱 之於 932 * 512 = 477184 位元組
磁區大小 (邏輯/實體):512 位元組 / 512 位元組
I/O 大小 (最小/最佳化):512 位元組 / 512 位元組
磁碟識別碼:0x00000000

所用裝置 開機      開始         結束      區塊   識別號  系統
/dev/sdb1               9       17184     8003584    b  W95 FAT32

2011年9月7日 星期三

開工單時,Routing Automatic Selection

Column解釋:
1....
2.selection priority
3.N:normal routing ; S:reference routing
4....
...

接下來
1.Selection ID : 剛才所config的資料
2.Routing Selection : 1->always reference routing ; 2~5->normal routing,只是optional/mandatory...差別

create_function_call 重複呼叫

for my $bukrs (@bukrs) {
     $rc = $rd->create_function_call;
     $rc->BUKRS("$bukrs");
     $rc->BRDATU(@ym);       
     $rc->invoke;   
     ...
}

呼叫時,create_function_call / invoke 是一個pair,要在迴圈內

Perl : eval example

      eval {$rc->invoke;};
      if ($@)    {
          warn "RFC Error: $@\n";
          $conn = SAPNW::Rfc->rfc_connect();
          $rd = $conn->function_lookup("Z_BACKFLUSH_BY_WO_CONFIRM");
      }

2011年9月6日 星期二

oracle jobs interval

不用case也能半小時refresh一次 :
trunc(sysdate,'HH')+3/1440+ceil(to_char(sysdate,'MI')/30)*30/1440

begin
  sys.dbms_job.change(job => xxx,
                      what => 'yyy;',
                      next_date => sysdate,
                      interval => 'trunc(sysdate,''HH'')+8/1440+ceil(to_char(sysdate,''MI'')/30)*30/1440');
  commit;
end;
/

2011年9月4日 星期日

大周皇族 第一卷黑暗重生 第七百五十六章 三皇圣器

君子坦荡,求仁得仁,求义得义。生死有道,若是死得其所,也没有什么可惜的

2011年9月2日 星期五

Linux - hpacucli

http://www.datadisk.co.uk/html_docs/redhat/hpacucli.htm
=> controller slot=0 modify cacheratio=25/75
=> controller slot=0 modify cacheratio=?
=> ctrl slot=0 show
=> ctrl slot=0 show config detail (包含logical drive 在unix 下的device name)
=> ctrl slot=0 array b pd all show (查詢2nd array 下的physical disk status)
=> ctrl slot=0 array b pd all show detail


http://people.freebsd.org/~jcagle/hpacucli-readme 
 

HP ProLiant management tools for Ubuntu / Debian based server

http://www.unrelatedshit.com/2011/05/30/proliant-management-tools-for-ubuntu-debian/

So you just got yourself a brand new and shiny HP ProLiant server to play with, installed your favorite distribution and life is good. Except... unless your distribution of choice is RHEL or SuSE, there's no way to monitor or even configure all those nice little gadgets that made you go with a ProLiant server instead of some random white box server.
If you go to the HP support site to download drivers and software, usually all you get is a choice between various versions of Windows, NetWare (anyone still using that?), Solaris, VMware ESX and for Linux: RHEL and SuSE. Sure, you can convert the RPM packages to deb using alien, but it's kind of a PITA and doesn't necessarily work reliably. Wouldn't it be much nicer if there were packages for Ubuntu or Debian?
Guess what? There are packages for Debian based systems. There's even a repository containing all the versions and architectures you need. But for some reason unbeknown to man, HP decided not to put it in there with the other OSes, but hide it instead.
Just add this to your APT sources (/etc/apt/sources.list or equivalent):
deb http://downloads.linux.hp.com/SDR/downloads/ProLiantSupportPack/ lucid current/non-free
(nothing for Maverick yet, but the packages for Lucid worked just fine for me)
Then run apt-get update and install any of the packages you might need:
cpqacuxe
hp-health
hpsmh
hp-smh-templates
hp-snmp-agents
hpacucli
hponcfg
Say you want to monitor your servers temperatures using Monitorix or check your fan-status and PSU redudancy:
# apt-get install hp-health
# hplog -t
ID     TYPE        LOCATION      STATUS    CURRENT  THRESHOLD
 1  Basic Sensor I/O Zone        Normal   114F/ 46C 158F/ 70C
 2  Basic Sensor Ambient         Normal    68F/ 20C 102F/ 39C
 3  Basic Sensor CPU (1)         Normal    86F/ 30C 260F/127C
 4  Basic Sensor CPU (1)         Normal    86F/ 30C 260F/127C
 5  Basic Sensor Pwr. Supply Bay Normal   123F/ 51C 170F/ 77C
 6  Basic Sensor CPU (2)         Normal    86F/ 30C 260F/127C
 7  Basic Sensor CPU (2)         Normal    86F/ 30C 260F/127C
Or take a look at your internal cciss RAID configuration, see if all disks are still in working condition or change your array setup without having to reboot your server to do it at the BIOS level:
# apt-get install hpacucli
# hpacucli ctrl all show status
 Smart Array P400 in Slot 1 
 Controller Status: OK
 Cache Status: OK 
 Battery/Capacitor Status: OK
Change your iLO parameters or reboot the management processor if it got stuck for some reason?
apt-get install hponcfg
# hponcfg -h
Firmware Revision = 1.94 Device type = iLO Driver name = hpilo
HPONCFG RILOE II/iLO setup and configuration utility
Version 3.1.0 (c) Hewlett-Packard Company, 2010

hponcfg  -?
hponcfg  -h
hponcfg  -m minFw
hponcfg  -r [-m minFw ]
hponcfg  [-a] -w filename [-m minFw]
hponcfg  -g [-m minFw]
hponcfg  -f filename [-l filename] [-s namevaluepair] [-v] [-m minFw]
hponcfg  -i [-l filename] [-s namevaluepair] [-v] [-m minFw]

-h,  --help           Display this message
-?                    Display this message
-r,  --reset          Reset the RILOE II/iLO to factory default
-f,  --file           Get/Set RILOE II/iLO configuration from "filename"
-i,  --input          Get/Set RILOE II/iLO configuration from the XML input
                      received through the standard input stream.
-w,  --writeconfig    Write the RILOE II/iLO configuration to "filename"
-a,  --all            Capture complete iLO configuration to the file.
                      This should be used along with '-w' option
-l,  --log            Log replies to "filename"
-v,  --xmlverbose     Display all the responses from RILOE II/iLO
-s,  --substitute     Substitute variables present in input config file
                      with values specified in "namevaluepairs"
-g,  --get_hostinfo   Get the Host information
-m,  --minfwlevel     Minimum firmware level
Way better than having to unwrap the documentation packages and pop in a CD or having to find and download a RPM, upload it to your server, convert it with alien and hope it kinda works, isn't it?

Alien on Ubuntu

http://wiki.ubuntu-tw.org/index.php?title=HowtoInstallRPM
Alien 可以幫你將 LSB、Red Hat、Stampede 以及 Slackware 的套件轉換為 deb 格式,然後您就可以進行安裝。
rpm 檔案是 Redhat/Fedora Core 的 Linux 所使用的安裝檔,有時候軟體商只提供 rpm 檔案時,Ubuntu 必須要使用 alien 先行轉檔才能安裝。

$ alien 你的 rpm 檔
$ sudo dpkg -i xxx.deb

2011年9月1日 星期四

column level policy

http://yumianfeilong.com/html/2010/12/23/482.html

Oracle VPD是Oracle advance security的一部分,其中的Column level VPD可以隔离应用访问某列数据。Column level VPD有2种模式。
  1. Default behavior: restricts the number of rows returned by a query.
  2. Masking behavior: returns all rows, but returns NULL values for the columns that contain sensitive information.
其中的Masking behavior,当应用程序SQL访问到被VPD约束的列的时候,Oracle将NULL作为列值返回给客户端,但不影响其它的列访问。
(其實based on user,return 1=1 or 1=2 也可以卡住???)
例子如下function oracle.sal_fucntion会返回 return “1=2″; 建立VPD policy,限制所有应用用户不能够查询emp表上的salary信息。
execute dbms_rls.add_policy (object_schema => ‘scott’,
object_name => ‘emp’,
policy_name => ‘my_policy’,
function_schema => ‘oracle’,
policy_function => ‘sal_function’,
sec_relevant_cols=>’salary’,
sec_relevant_cols_opt=>dbms_rls.ALL_ROWS);
用户查询emp表,其他列的数据都正常返回,只有salary列全返回NULL。

SYS@ SQL> conn scott/tiger
Connected.
SCOTT@ SQL> select * from emp;
EMPNO ENAME      JOB              MGR HIREDATE               SAL       COMM     DEPTNO
———- ———- ——— ———- ————— ———- ———- ———-
7369 SMITH      CLERK           7902 17-DEC-80                                     20
7499 ALLEN      SALESMAN        7698 20-FEB-81                         300         30
7521 WARD       SALESMAN        7698 22-FEB-81                         500         30
7566 JONES      MANAGER         7839 02-APR-81                                     20
7654 MARTIN     SALESMAN        7698 28-SEP-81                        1400         30
7698 BLAKE      MANAGER         7839 01-MAY-81                                     30
7782 CLARK      MANAGER         7839 09-JUN-81                                     10
7788 SCOTT      ANALYST         7566 19-APR-87                                     20
7839 KING       PRESIDENT            17-NOV-81                                     10
7844 TURNER     SALESMAN        7698 08-SEP-81                           0         30
7876 ADAMS      CLERK           7788 23-MAY-87                                     20
7900 JAMES      CLERK           7698 03-DEC-81                                     30
7902 FORD       ANALYST         7566 03-DEC-81                                     20
7934 MILLER     CLERK           7782 23-JAN-82                                     10
14 rows selected.
且在emp上建立的view,在 SQL parse的时候也会被基础表上的VPD policy约束。
SCOTT@: SQL> select text from user_views where view_name=’EMP_SEC’;
TEXT
——————————————————————————–
select “EMPNO”,”ENAME”,”JOB”,”MGR”,”HIREDATE”,”SAL”,”COMM”,”DEPTNO” from scott.emp
SCOTT@: SQL> select * from scott.emp_sec where rownum<=3;
EMPNO ENAME JOB         MGR     HIREDATE           SAL    COMM    DEPTNO
———- ———- ——— ———- ————— ———-
7369 SMITH CLERK        7902     17-DEC-80                               20
7499 ALLEN SALESMAN 7698     20-FEB-81                    300      30
7521 WARD SALESMAN 7698      22-FEB-81                    500     30
通过使用 10060 和 10730 event,可以发现Oracle在SQL层次将查询进行了重写。
Logon user     : ORACLE
Table/View     : SCOTT.EMP
Policy name    : my_policy
Policy function: ORACLE.sal_function
RLS view :
SELECT  “EMPNO”,”ENAME”,”JOB”,”MGR”,”HIREDATE”, CASE WHEN (1 = 2) THEN “SAL” ELSE NULL END “SAL”,”COMM”,”DEPTNO” FROM “SCOTT”.”EMP”   “EMP”
改写成了CASE形式。
但是VPD不能够限制SYS用户;SYS用户仍然能够看到Salary的信息。不过结合Oracle其它的安全方案(如TDE),将VPD恰当的应用在服务器端,可以解决一些安全问题,因为它对客户端是完全透明的。


以下為另一篇相關文章
http://ksadba.wordpress.com/2009/04/22/virtual-private-database-vpd-column-masking-simple-example/

Exclude Some Users from Policy

Users who need to see all the data without any masking need to be granted “exempt access policy

Notes:

  • Dropping a table that has a policy will drop the policy but not the function policy.
  • Renaming the table will NOT drop the policy or disable it. The policy will remain active.
  • Export/Import will also export/import the policy along with the table, but will not export/import the function policy.
  • When exporting a table under a policy, make sure the user exporting the table has “exempt access policy” grant, otherwise, the column under the policy will always be null and column data will be lost.

Some Important Views

dba_policies
v$vpd_policy