2013年12月29日 星期日

delphi mutex


//single mode
program
 Project1;

uses
  Windows,
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}

const
  MutexName = 'onlyone_MUTEX';
  ClassName = 'TForm1';
  WindowName = 'Form1';
var
  Mutex: THandle;
  Handle: THandle;
begin
  Mutex := OpenMutex(MUTEX_ALL_ACCESS, False, MutexName);
  if Mutex <> 0 then
  begin
    Handle := FindWindow(ClassName, WindowName);
    SetForegroundWindow(Handle);
    Exit;
  end;
  CreateMutex(nil, False, MutexName);
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

delphi Critical Section、Event、Mutex、Semaphores

用於多緒TThread 等待
臨界區(Critical Section)
Txxx=class
  protected
    FSection: TRTLCriticalSection;
...
Txxx.Create;
InitializeCriticalSection(FSection); 建立臨界區

EnterCriticalSection(FSection) 進入臨界區
try
   DO...
finally
LeaveCriticalSection(FSection 離開臨界區
end;

Txxx.destory;
DeleteCriticalSection(FSection);

事件(Event)
CreateEvent() 建一個信號量
SetEvent()      on
RsetEvent(  )  off
CloseHandle()
互斥量(Mutex)
CreateMutex()
OpenMutex()
ReleaseMutex()
CloseHandle()
信號量(Semaphores)
CreateSemaphore()
OpenSemaphore()
ReleaseSemaphore()
CloseHandle()

WaitForSingleObject(等待訊號,等待時間)單一訊號
WaitForMultipleObjects(等待數量,等待訊號,等全部,等待時間)多訊號

Return code/value_
WAIT_OBJECT_0 to (WAIT_OBJECT_0 +nCount– 1)
WAIT_ABANDONED_0 to (WAIT_ABANDONED_0 +nCount– 1)
WAIT_TIMEOUT
WAIT_FAILED ...

訊號類型
Change notification
Console input
Event
Memory resource notification
Mutex
Process
Semaphore
Thread
Waitable timer

2013年12月28日 星期六

數位簽章概念理解

角色
使用者A:文件製作者
使用者B:文件接收者

數位文件: OFFICE /PDF/TXT ....
當使用者A要將製作的數位文件傳送給使用者B時的問題
1.     如何確保數位文件沒有被修改
解決方案:Message Digest(訊息摘要)
                 使用一種數學函式,將文件運算產生一個數值,這個數值稱為hashmessage Digest,如果文件有變更過,則這個數值也會變更,因此可以用來檢查郵件對是否被修改.

2.使用者B如何確認文件是使用者A

解決方案:Digital signatures (數位簽名)
將上述的Message Digest使用自己的私鑰來加密,文件包含了使用
文件發出
A.使用A用私鑰加密Message Digest
B.使用者A將文件與加密後的Message Digest傳送給使用者B
C.使用者A的公鑰
文件接收
C.使用者B收到文件後用hash函數工具計算出訊息摘要A
D.使用者B用使用者提供的公鑰解密訊息摘要B
E.比對 訊息摘要A 訊息摘要B 即可確認文件無誤由使用者A發出

3.如何確保使用者A不是假冒的

解決方案: Certificate Authority(憑證的認證中心)第三方公證

使用者A與使用者B都有一個憑證證明他們是誰(如身份證),我們透過Certificate Authority(憑證的認證中心),幫我們確認身份,公私鑰也由憑證中心發放,公鑰存放在憑證中心,私鑰自己保管

2013年12月27日 星期五

SQL2012 排名函數

(A) ROW_NUMBER  排序
ROW_NUMBER() OVER ( [ <partition_by> ] < order_by_clause > )

(B) RANK  跳號排名

RANK()       OVER ( [ <partition_by> ] < order_by_clause > )

(C) DENSE_RANK 不跳號排名

DENSE_RANK() OVER ( [ <partition_by> ] < order_by_clause > )

(D) NTILE(4) 分組

NTILE (n)    OVER ( [ <partition_by> ] < order_by_clause > )



A B C D
1 1 1 1
2 1 1 1
3 1 1 2
4 1 1 2
5 1 1 3
6 6 2 3
7 6 2 4
8 6 2 4


sql 2012 分析函數

LAG 上一(N)筆資料
語法
LAG (欄位 ,上幾筆 ,往前抓不到資料時的預設值)
           OVER (  partition by 分組欄位  order by 欄位)
LEAD 下一(N)筆資料
語法
LEAD  (欄位 ,下幾筆 ,往後抓不到資料時的預設值)
           OVER (  partition by 分組欄位  order by 欄位)
FIRST_VALUE 第一筆資料
語法
FIRST_VALUE (欄位)
           OVER (  partition by 分組欄位  order by 欄位)
LAST_VALUE 最後一筆資料
語法
LAST_VALUE (欄位)
           OVER (  partition by 分組欄位  order by 欄位)

排名百分比
RANK():使用RANK()次序函數來計算每筆資料列的次序編號。若遇到相同的值時,RANK()次序函數會計算傳回相同的次序值,而下一個編號會跳號後再編,因此,不一定會傳回連續的整數值。
CUME_DIST() = RANK() / 總資料列筆數
PERCENT_RANK() = (RANK()-1) / (總資料列筆數-1)
排名百分比分佈
PERCENTILE_CONT (0.5)傳回排名50%內插值取代接近值
PERCENTILE_DISC(0.5)  傳回排名50%實際值

2013年12月26日 星期四

SQL 2012 函數 OVER 說明

OVER ( 
       [ <PARTITION BY clause> ]
       [ <ORDER BY clause> ] 
       [ <ROW or RANGE clause> ]
      ) 
PARTITION BY 欄位
                        將Select查詢結果集依欄位內容作群組分類。(例 部門欄位 依各部門作群組再做計算)
ORDER BY 欄位 ASC | DESC
            依PARTITION 定義群組結果集做邏輯順序,沒設定PARTITION的話就是全部
ROWS | RANGE  CURRENT ROW...
                       依PARTITION 定義與ORDER BY 的資料範圍,再設定指定的範圍詳下列說明
UNBOUNDED PRECEDING
第一筆資料,指的是PARTITION 與 ORDER所限定的範圍
<指定不帶正負號的值> PRECEDING
從目前資料往前幾筆。 RANGE 不允許這項指定。
CURRENT ROW
目前這一筆,可以當這一筆開始或到這一筆結束。
BETWEEN <開始筆數 > AND <結束筆數 >
與 ROWS 或 RANGE 一起使用,以指定計算的筆數視 上限不能小於下限。
UNBOUNDED FOLLOWING
最後一筆資料,指的是PARTITION 與 ORDER所限定的範圍
<指定不帶正負號的值> FOLLOWING
從目前資料往後幾筆。 RANGE 不允許這項指定。
備註
1.在含有一個 FROM 子句的單一查詢中,可以使用一個以上的視窗函數。 每個函數的 OVER 子
句在進行資料分割和進行排序時,都不一樣。
2.如未指定 PARTITION BY,此函數會將查詢結果集的所有資料列視為單一群組。
3.如果未指定 ORDER BY,則將整個資料分割用於視窗框架。 這只適用於不需要 ORDER BY 子
句的函數。 如果未指定 ROWS/RANGE,但指定了 ORDER BY,則將 
RANGE UNBOUNDED PRECEDING AND CURRENT ROW 當做視窗框架的預設值。 
這只適用於可以接受選擇性 ROWS/RANGE 指定的函數。 
例如,排名函數不能接受 ROWS/RANGE,因此,即使存在 ORDER BY 而不存在 ROWS/RANGE
,這個視窗框架依然不適用。
4.如果指定了 ROWS/RANGE 而且 <之前的視窗框架> 用於 <視窗框架範圍> (簡短語法),
則這個指定會用於視窗框架邊界開始點,而 CURRENT ROW 則用於邊界結束點。 
例如,“ROWS 5 PRECEDING” 等於 “ROWS BETWEEN 5 PRECEDING AND CURRENT ROW”。