2014-09-21

PDF 簡轉繁

現在一些技術文件,簡體中文比正體中文多很多,因為實在看不慣簡體字,因此通常會將簡體字轉正體字再看。在瀏灠器上可以使用同文堂, PDF 就沒有可以在瀏灠時直接做繁簡轉換的程式,因此找了一個工具,先把 PDF 內容轉成正體字,再放到 PDF Reader 裡開啟。

使用工具環境:

安裝步驟

sudo easy_install pdfrw
sudo easy_install fonttools
sudo easy_install chardet
brew install opencc

ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)”
brew install opencc
sudo mkdir -p /usr/share/fonts/truetype/droid/
sudo curl https://raw.githubusercontent.com/android/platform_frameworks_base/master/data/fonts/DroidSansFallbackFull.ttf -o /usr/share/fonts/truetype/droid/DroidSansFallbackFull.ttf
git clone https://github.com/tjwei/translatePDF.git
cd translatePDF

在 translatePDF 目錄下,執行以下指令即可轉換 pdf 的內容了:

python2.7 tpdfrw.py /Users/scott/Downloads/Architect.pdf

註:
如 pdf 檔被鎖定的話,是無法轉換的。

2014-09-05

如何追查 SQL Server 的 Deadlock

最近有個客戶常遇到 SQL Server 的 Deadlock 問題,查了一下,追踨 Deadlock 有兩個做法(實際應該是一樣的):
  1. 使用 SQL Server Profiler 去記錄
  2. 直接下 SQL 新增追踨

以下是使用 SQL 指令追踨的方法:

  1. 建立追踨 Deadlock (假定追踨檔是要存在 D:\DbLog\ 下)
     -- 運行下述語句後,每當SQL Server中發生死鎖事件,都會自動往文件e:\DbLog\deadlockdetect.trc 中插入一條記錄。
     -- 定義參數 
     declare @rc int
     declare @TraceID int
     declare @maxfilesize bigint
     set @maxfilesize = 5
     -- 初始化跟蹤 
     exec @rc = sp_trace_create @TraceID output, 0, N'E:\DbLog\deadlockdetect', @maxfilesize, NULL
     --    此處的e:\dblog\deadlockdetect是文件名(可自行修改),SQL會自動在後面加上.trc的擴展名 
     if (@rc != 0) goto error 
     -- 設置跟蹤事件 
     declare @on bit
     set @on = 1
     --下述語句中的148指的是locks:deadlock graph事件(參見sys.trace_events),12指的是spid列(參見    sys.trace_columns) 
     exec sp_trace_setevent @TraceID, 148, 1, @on
     exec sp_trace_setevent @TraceID, 148, 4, @on
     exec sp_trace_setevent @TraceID, 148, 11, @on
     exec sp_trace_setevent @TraceID, 148, 12, @on
     exec sp_trace_setevent @TraceID, 148, 14, @on
     exec sp_trace_setevent @TraceID, 148, 26, @on
     exec sp_trace_setevent @TraceID, 148, 41, @on
     exec sp_trace_setevent @TraceID, 148, 51, @on
     exec sp_trace_setevent @TraceID, 148, 60, @on
     exec sp_trace_setevent @TraceID, 148, 64, @on
     -- 啟動跟蹤 
     exec sp_trace_setstatus @TraceID, 1
     -- 記錄下跟蹤ID,以備後面使用 
     select TraceID = @TraceID
     goto finish 
     error: 
     select ErrorCode=@rc
     finish: 
     go
    
  2. 當發生 Deadlock 後,去查看 deadlockdetect.trc 是哪些 SQL 有問題 (結果中的TextData列即以XML的形式返回死鎖的詳細信息。 )
     select fn_trace_gettable('e:\DbLog\deadlockdetect.trc', 1)
    
  3. 查詢、暫停和停止服務器端跟蹤
    查詢目前有哪些 Traces 正在執行
     SELECT * FROM sys.traces
    
    暫停某個 Trace
     -- 第一個參數表示TraceID,即步驟1中的輸出參數(或是從 sys.traces 查詢得到)。第二個參數表示將狀態改為0,即暫停
     exec sp_trace_setstatus 2, 0
    
    中止某個 Trace
     -- 第一個參數表示TraceID,即步驟1中的輸出參數(或是從 sys.traces 查詢得到)。第二個參數表示將狀態改為2,即停止
     exec sp_trace_setstatus 2, 2
    
  4. 在 Deadlock 的情況下,也可以直接查詢目前正在執行的 SQL
    SELECT sqltext.TEXT,req.session_id,
     req.status,
     req.command,
     req.cpu_time,
     req.total_elapsed_time,
     s.host_name,
     s.login_time,
     s.login_name
    FROM sys.dm_exec_requests req
     CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS sqltext
     INNER JOIN sys.dm_exec_sessions s ON req.session_id = s.session_id
    where DB_NAME(req.database_id) = '資料庫名稱'
    

2014-07-24

Windows 2008 單一網卡架 VPN Server

因為偶而需要去大陸出差,需要一個跳板可以突破 GFW ,之前都是利用 SSH Tunnel ,不過在 ipad 上無法使用,因此找了台主機來架 VPN Server。網路上找到的範例教學大多是利用兩張網卡,研究了好久才知道 Windows 2008 是要怎樣設定,步驟如下:

  1. 新增路由及遠端存取
     
  2. 選擇自定設定
     
  3. 選取『VPN存取』及『NAT』
     
  4. 完成新增
     
  5. 設定  DHCP 發送位址範圍
  6. 設定 NAT,選取區域連線
  7. 選取『連線到網際網路的公用介面』及『在這個介面上啟用NAT』
     
  8. 完成後,即可利用 PPTP 的方式 VPN 連線到此台電腦,利用此電腦的網路上網了  

2014-03-18

iOS 7.1 無法利用 http 佈署企業 app

目前開發企業內部使用之 app ,iOS 7 之前,用企業 provision 可以將程式打包成 ipa 檔,利用 itms-services:// 開頭的網址搭配一個描述檔 (plist) 來安裝 ipa 檔,如
itms-services://?action=download-manifest&url=http://www.test.com/app.plist

可是到了 iOS 7.1 之後,就會發生:無法安裝應用程式,因為「www.test.com」的憑證無效。

上網查了一下,才發現原來 iOS 7.1 之後 plist 檔一定要在認可的 https 協定下載,目前可行的方法有:

  1. 為網站購買 SSL 憑證,改走 https 的方式進行安裝
  2. 使用 openssl 自簽憑證,iDevice 上要先匯入自簽根憑證才可使用
  3. 將 plist 檔放在別人提供的 https 空間(如 dropbox),再利用此種模式下載安裝
第一種方式就不用講了,第二種方式的處理方式如下:
  1. 產生自簽根金鑰
    openssl genrsa -out myCA.key 2048
  2. 產生自簽根憑證
    openssl req -x509 -new -key myCA.key -out myCA.cer -days 3650 -subj /CN="小虫CA"
  3. 產生網站金鑰
    openssl genrsa -out mycert1.key 2048
  4. 產生 CSR
    openssl req -new -out mycert1.req -key mycert1.key -subj /CN=www.test.com
  5. 利用自簽根金鑰
    openssl x509 -req -in mycert1.req -out mycert1.cer -CAkey myCA.key -CA myCA.cer -days 365 -CAcreateserial -CAserial serial
  6. 網站使用 mycert1.key 及 mycert1.cer 來加密,iDevice 先匯入 myCA.cer 即可利用 https 連線到網站上了
  7. 再利用以下網址即可進行網路安裝 ipa
    itms-services://?action=download-manifest&url=https://www.test.com/app.plist
第三種方式,可以將 plist 放置 Dropbox 上,步驟如下:
  1. 將 plist 檔放置 dropbox 下
  2. 取得 plist 檔的分享路徑,如
    https://www.dropbox.com/s/jwwu4p1kctqenva/app.plist
  3. 將 www.dropbox.com 改為 dl.dropboxusercontent.com,如
    https://dl.dropboxusercontent.com/s/jwwu4p1kctqenva/app.plist
  4. 將 app 安裝的網址改為使用第三點的 link 即可,如:
    itms-services://?action=download-manifest&url=https://dl.dropboxusercontent.com/s/jwwu4p1kctqenva/app.plist

2014-01-23

如何在 Genymotion 模擬器上新增 Google Framework

新版的 Genymotion 因為版權問題,android 模擬器中不含 Google Framework ,目前有兩種做法:
Genymotion  2.0.0 版後因正式營利,所以 2.0.0 版後的 ova 內不包括有版權的 gapps 及 ARM library,目前的做法有兩種:

  1. 使用舊版含 gapps 的 ova : 官方載點似乎已經找不到了,要各憑本事找
  2. 在新的 ova vm 中安裝 gapps 及 ARM library
安裝步驟如下:
  1. 下載相關檔案:
    ARM Translation Installer v1.1
    Google Apps for Android 4.3
    Google Apps for Android 4.2
    Google Apps for Android 4.1
  2. 開啟 Genymotion 模擬器,解鎖到 home screen
  3. 將 Genymotion-ARM-Translation.zip 拖拉進 vm 的視窗中,進行安裝,裝完後將 vm 重新開機
  4. 將對應的 Gapp檔案拖拉進 vm 中,進行安裝,裝完後再次重開機,就會有 Google play Store 可以使用了。

參考:
http://forum.gamer.com.tw/C.php?bsn=23805&snA=165002
http://stackoverflow.com/questions/17831990/how-do-you-install-google-frameworks-play-accounts-etc-on-a-genymotion-virtu