2015年3月31日 星期二

[PHP] 連接postgresql code

以php連接postgresql程式碼,以下『飯粒』會輸出連接的資料庫中,

所有的資料表名稱。

 <?php  
 //查出資料庫中所有的資料表  
 $sql="SELECT table_name  
  FROM information_schema.tables  
  WHERE table_schema='public'  
   AND table_type='BASE TABLE';";  
 //連接字串  
 $conn_string= "host=192.168.1.30 port=5432 dbname=TESTDB user=postgres password=mydbpw";  
 //開啟連接  
 $connection= pg_connect($conn_string);  
 //執行SQL並傳回結果  
 $myresult = pg_exec($connection, $sql);  
 //確認有回傳結果  
 if (isset($myresult))  
 {  
  //輸出所有結果  
  for ($lt=0;$lt<pg_numrows($myresult);$lt++)  
  {  
   echo pg_result($myresult,$lt,'table_name').'<br>';  
  }  
 }  
 ?>  

[Postgresql] An operation was attempted on something that is not a socket 修復

Postgresql 有時候會突然無法啟動服務,檢視Log檔會出現,

An operation was attempted on something that is not a socket










目前觀察這個情況較容易發生在XP出現。

微軟的說明

http://support.microsoft.com/en-us/kb/817571

This issue may occur if you have a third-party product installed that uses Windows sockets and also uses the ipconfig, release, and renew commands. The Windows sockets registry subkeys may be corrupted.

這個問題也許是因為你有安裝第三方(非微軟)的軟體,它使用到Windows Socket 以及用到了ipconfig  release (釋放IP)以及 ipconfig renew (要求再次分配IP) 指令, Windows Socket 註冊的subkey 也許並不正確。

您可嘗試用上述URL下方的解法,或者嘗試本篇提供的懶人方法;

MicrosoftFixit50203.msi 


這個msi的說明
https://support.microsoft.com/en-us/kb/811259/zh-cn


基本上它是一個修復Winsock2 損壞  的工具,微軟提供的,用過幾次都可以正常修復。

操作步驟如下:


點二下開啟程式後會看到這個畫面,勾選『我同意』後按『下一步』




 等待處理中






處理完畢,點下『關閉』
點下『是』重開機一下就好了。




2015年3月29日 星期日

[Java] DIY 一個mac CPU使用率圖形

Mac OS 有一個指令,叫做  iostat ,它可以顯示硬體資訊,例如我輸入 iostat









會出現硬碟、CPU 等使用率資訊,us指的是使用者耗用的CPU使用率, sy是作業系統本身耗

用CPU使用率,id則為idle的意思,表示閒置的CPU使用率,例如本例 100- 6 -4 = 90 。

中途施工時發現一個問題,也就是mac的disk數量會變動,第1個disk0為硬碟,但disk1有可

能是安裝程式產生出來的一個disk,或是隨身碟。










這個程式會利用到iostat 的一個參數 -w ,它可以在每次執行iostat 後,間隔指定的時間,再

輸出一次資料,直到永遠(除非你去取消它)。

這程式中用到了

iostat -w 1 ,表示每隔一秒會輸出一次資訊。

接下來是要用來繪圖用的一個JComponent 程式碼,透過

overwrite  paintComponent  的方式來繪製元件的內容。

 
package javamaccpu_useage;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JComponent;

/**
 *
 * @author flowercatswets
 */
public class DrawPanel extends JComponent
{
    int useage[]=new int[100];
    int shift=30;
    @Override
    public void paintComponent(Graphics g) {
   super.paintComponent(g);
   g.clipRect(0, 0, 120, 400);
   g.setColor(Color.black);
   //黑底   
   g.fillRect(shift, 0, shift+100, 100);
   //畫白橫格線
   g.setColor(Color.white);
   for (int i=20;i<=100;i=i+20)
   {
       g.drawLine(shift, i, 100+shift, i);
   }
   //畫白垂直格線
   for (int i=20;i<=100;i=i+20)
   {
       g.drawLine(shift+i, 0, shift+i, 100);
   }
    //畫上數值20  40 60 80 100
    g.setColor(Color.black);  
   for (int i=100;i>=20;i=i-20)
   {
       g.drawString(String.valueOf(100-i), 0, i);
   } 
   //畫上CPU使用率 
   g.setColor(Color.GREEN);   
   for (int i=0;i




然候是主程式
 
package javamaccpu_useage;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import javax.swing.JFrame;

/**
 *
 * @author flowercatswets
 */
public class JavaMacCPU_Useage {

    
    public static void main(String[] args) {
        //Init Class
       JavaMacCPU_Useage cpu=new JavaMacCPU_Useage(); 
       
       //Init JFrame
       JFrame JF=new JFrame("Mac CPU");
       JF.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       JFrame.setDefaultLookAndFeelDecorated(true);
       JF.setBounds(100, 100, 150, 150);
       //JF.pack();
       JF.setVisible(true);
       
       //InitDrawPanel
       DrawPanel dp=new DrawPanel();
       
       //Add JPanel to JFrame
       JF.getContentPane().add(dp);
       //Set DrawPanel Size
       dp.setBounds(0,0, 120, 120);
       //Excute 
       cpu.executeShell(dp,JF);
       
       
    }
    
    public void executeShell(DrawPanel dp,JFrame JF)
    {     
        //Init Process
        Process p;
        //Init CPU Useage array
        int[] useage=new int[100];;
        //command 
        String command="iostat -w 1";
        try
        {
         //run command
         p= Runtime.getRuntime().exec(command);
         //get Process input
         BufferedReader reader=new BufferedReader(new InputStreamReader(p.getInputStream()));
         //Init 
         String line="";        
         int totaluse;
         int offset = 0;
         //get inpurt data
         while((line=reader.readLine())!=null)
         {
             try
             {
                //  disk0           disk1       cpu     load average
                //      or 
                //   KB/t tps  MB/s     KB/t tps  MB/s  us sy id   1m   5m   15m
               if (line.contains("cpu") || line.contains("us"))
               {
                   //disk0           disk1       cpu     load average
                  if (line.contains("cpu"))
                  {
                       offset=findCPU_offset(line);
                  }
                  continue;
              }
              //get cpu data offset success 
              if (offset>0)
                totaluse=getCPU(line,offset);
              //get cpu data offset fail 
              else
                totaluse=0;
             //new data in the last of array
              useage[(useage.length-1)]=totaluse;
              //set data to draw              
              dp.setData(useage);
              //offset data to left postion
              for (int i=1;i<99;i++)
                 useage[i]=useage[i+1];
              //repant 
             JF.repaint();
             
             }
             catch(Exception e)
             {
                 e.printStackTrace();
             }
         }
        }
        catch(Exception e)
        {
        }
    }
    //取得CPU的資訊
    private int getCPU(String line,int offset)
    {
        int count=0;
        double us=0;
        double sys=0;
        
        String tmp[]=line.split(" ");
        for (String tmp1 : tmp) {
            if (tmp1.trim().length() > 0) {
                count++;
                if (count==(offset*3)+1) {
                    us = Double.parseDouble(tmp1);
                } else if (count==(offset*3)+2) {
                    sys = Double.parseDouble(tmp1);
                    break;
                }
            }
        }        
        return (int)(us+sys);        
    }
    
    //判斷CPU 的資訊在第幾個位置
    private int findCPU_offset(String line)
    {
        int count=0;
        int offset=0;
        
        String tmp[]=line.split(" ");
        for (String tmp1 : tmp) {
            if (tmp1.trim().length() > 0) {
                count++;
                if (tmp1.equals("cpu")) {
                    offset=count-1;
                }                
            }
        }        
        return offset; 
    }
    
    
}


接下來是執行結果截圖





2015年3月28日 星期六

[Java]在windows上透過wmic取得CPU使用率

程式來源
http://puremonkey2010.blogspot.tw/2011/05/java-cpu.html
資料來源
http://forum.slime.com.tw/thread61654.html

WMIC,英文全稱Windows Management Instrumentation Command-line,即Windows管理規範指令行。並聲稱使用WMIC,再配合其他現存的指令行工具,管理員幾乎可以完成所有的管理工作,而不必再過多地依賴那些圖形界面。最重要的是wmic可以支援格式化輸出。

具體來說,你可以使用WMIC實現如下的管理工作:

  1、本機電腦管理

  2、遠端單個電腦管理

  3、遠端多個電腦管理

  4、使用遠端會話的電腦管理(如Telnet)

  5、使用管理指令碼的自動管理


wmic使用範例可以參考這一篇
http://www.dotblogs.com.tw/dc690216/archive/2011/08/13/33059.aspx


程式碼共有如下五個

 
/*
 裝載監控的信息Bean
 */
package cpu_use;

/**
 *
 * @author bert
 */
public class MonitorInfoBean {
    /** 可使用內存. */  
    private long totalMemory;  
  
    /** */  
    /** 剩餘內存. */  
    private long freeMemory;  
  
    /** */  
    /** 最大可使用內存. */  
    private long maxMemory;  
  
    /** */  
    /** 操作系統. */  
    private String osName;  
  
    /** */  
    /** 總物理內存. */  
    private long totalMemorySize;  
  
    /** */  
    /** 剩餘的物理內存. */  
    private long freePhysicalMemorySize;  
  
    /** */  
    /** 已使用的物理內存. */  
    private long usedMemory;  
  
    /** */  
    /** 線程總數. */  
    private int totalThread;  
  
    /** */  
    /** cpu使用率. */  
    private double cpuRatio;  
  
    public long getFreeMemory() {  
        return freeMemory;  
    }  
  
    public void setFreeMemory(long freeMemory) {  
        this.freeMemory = freeMemory;  
    }  
  
    public long getFreePhysicalMemorySize() {  
        return freePhysicalMemorySize;  
    }  
  
    public void setFreePhysicalMemorySize(long freePhysicalMemorySize) {  
        this.freePhysicalMemorySize = freePhysicalMemorySize;  
    }  
  
    public long getMaxMemory() {  
        return maxMemory;  
    }  
  
    public void setMaxMemory(long maxMemory) {  
        this.maxMemory = maxMemory;  
    }  
  
    public String getOsName() {  
        return osName;  
    }  
  
    public void setOsName(String osName) {  
        this.osName = osName;  
    }  
  
    public long getTotalMemory() {  
        return totalMemory;  
    }  
  
    public void setTotalMemory(long totalMemory) {  
        this.totalMemory = totalMemory;  
    }  
  
    public long getTotalMemorySize() {  
        return totalMemorySize;  
    }  
  
    public void setTotalMemorySize(long totalMemorySize) {  
        this.totalMemorySize = totalMemorySize;  
    }  
  
    public int getTotalThread() {  
        return totalThread;  
    }  
  
    public void setTotalThread(int totalThread) {  
        this.totalThread = totalThread;  
    }  
  
    public long getUsedMemory() {  
        return usedMemory;  
    }  
  
    public void setUsedMemory(long usedMemory) {  
        this.usedMemory = usedMemory;  
    }  
  
    public double getCpuRatio() {  
        return cpuRatio;  
    }  
  
    public void setCpuRatio(double cpuRatio) {  
        this.cpuRatio = cpuRatio;  
    }  
}


 
/*
提供解耦合的介面
 */
package cpu_use;

/**
 *
 * @author bert
 */
public interface IMonitorService {
      /** *//** 
     * 獲得當前監控對像. 
     * @return 返回監測對象 
     * @throws Exception 
     */  
    public MonitorInfoBean getMonitorInfoBean() throws Exception;  
}


 
/*
獲取系統訊息的實作類別
 */
package cpu_use;

import java.io.InputStreamReader;  
import java.io.LineNumberReader;  
//import sun.management.ManagementFactory;  
import java.lang.management.ManagementFactory;
import com.sun.management.OperatingSystemMXBean; 

public class MonitorServiceImpl implements IMonitorService
{
    public  static final int CPUTIME = 5000;  
    private static final int PERCENT = 100;  
    private static final int FAULTLENGTH = 10;  
    private static String PROC_CMD = System.getenv("windir")  
                                    + "\\system32\\wbem\\wmic.exe process get Caption,CommandLine,"  
                                    + "KernelModeTime,ReadOperationCount,ThreadCount,UserModeTime,WriteOperationCount";  
    private long[] initCpuInfo = null;  
      
    public MonitorServiceImpl(){  
        try{  
            initCpuInfo = readCpu(Runtime.getRuntime().exec(PROC_CMD));  
        }catch(Exception e){  
            e.printStackTrace();  
            initCpuInfo = null;  
        }  
    }  
      
    @Override  
    public MonitorInfoBean getMonitorInfoBean() throws Exception {  
        int kb = 1024;  
          
        // 可使用內存  
        long totalMemory = Runtime.getRuntime().totalMemory() / kb;  
        // 剩餘內存  
        long freeMemory = Runtime.getRuntime().freeMemory() / kb;  
        // 最大可使用內存  
        long maxMemory = Runtime.getRuntime().maxMemory() / kb;  
  
        OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory  
                .getOperatingSystemMXBean();  
  
        // 操作系統  
        String osName = System.getProperty("os.name");  
        // 總物理內存  
        long totalMemorySize = osmxb.getTotalPhysicalMemorySize() / kb;  
        // 剩餘的物理內存  
        long freePhysicalMemorySize = osmxb.getFreePhysicalMemorySize() / kb;  
        // 已使用的物理內存  
        long usedMemory = (osmxb.getTotalPhysicalMemorySize() - osmxb  
                .getFreePhysicalMemorySize())  
                / kb;  
  
        // 獲得線程總數  
        ThreadGroup parentThread;  
        for (parentThread = Thread.currentThread().getThreadGroup(); parentThread  
                .getParent() != null; parentThread = parentThread.getParent())  
            ;  
        int totalThread = parentThread.activeCount();  
  
        double cpuRatio = 0;  
        if (osName.toLowerCase().startsWith("windows")) {             
            cpuRatio = this.getCpuRatioForWindows();  
        }  
          
        // 返回對象  
        MonitorInfoBean infoBean = new MonitorInfoBean();  
        infoBean.setFreeMemory(freeMemory);  
        infoBean.setFreePhysicalMemorySize(freePhysicalMemorySize);  
        infoBean.setMaxMemory(maxMemory);  
        infoBean.setOsName(osName);  
        infoBean.setTotalMemory(totalMemory);  
        infoBean.setTotalMemorySize(totalMemorySize);  
        infoBean.setTotalThread(totalThread);  
        infoBean.setUsedMemory(usedMemory);  
        infoBean.setCpuRatio(cpuRatio);  
        return infoBean;  
    }  
      
    private double getCpuRatioForWindows() {  
        try {  
            if(initCpuInfo==null) return 0.0;  
            // 取得進程信息  
            //long[] c0 = readCpu(Runtime.getRuntime().exec(PROC_CMD));  
            //Thread.sleep(CPUTIME);  
            long[] c1 = readCpu(Runtime.getRuntime().exec(PROC_CMD));  
            if (c1 != null) {  
                long idletime = c1[0] - initCpuInfo[0];  
                long busytime = c1[1] - initCpuInfo[1];  
                return Double.valueOf(  
                        PERCENT * (busytime) / (busytime + idletime))  
                        .doubleValue();  
            } else {  
                return 0.0;  
            }  
        } catch (Exception ex) {  
            ex.printStackTrace();  
            return 0.0;  
        }  
    }  
      
    private long[] readCpu(final Process proc) {  
        long[] retn = new long[2];  
        try {  
            proc.getOutputStream().close();  
            InputStreamReader ir = new InputStreamReader(proc.getInputStream());  
            LineNumberReader input = new LineNumberReader(ir);  
            String line = input.readLine();  
            if (line == null || line.length() < FAULTLENGTH) {  
                return null;  
            }  
            int capidx = line.indexOf("Caption");  
            int cmdidx = line.indexOf("CommandLine");  
            int rocidx = line.indexOf("ReadOperationCount");  
            int umtidx = line.indexOf("UserModeTime");  
            int kmtidx = line.indexOf("KernelModeTime");  
            int wocidx = line.indexOf("WriteOperationCount");  
            long idletime = 0;  
            long kneltime = 0;  
            long usertime = 0;  
            while ((line = input.readLine()) != null) {  
                if (line.length() < wocidx) {  
                    continue;  
                }  
                // 字段出現順序:Caption,CommandLine,KernelModeTime,ReadOperationCount,  
                // ThreadCount,UserModeTime,WriteOperation  
                String caption = Bytes.substring(line, capidx, cmdidx - 1).trim();  
                String cmd = Bytes.substring(line, cmdidx, kmtidx - 1).trim();  
                if (cmd.indexOf("wmic.exe") >= 0) {  
                    continue;  
                }  
                // log.info("line="+line);  
                if (caption.equals("System Idle Process")  
                        || caption.equals("System")) {  
                    idletime += Long.valueOf(  
                            Bytes.substring(line, kmtidx, rocidx - 1).trim())  
                            .longValue();  
                    idletime += Long.valueOf(  
                            Bytes.substring(line, umtidx, wocidx - 1).trim())  
                            .longValue();  
                    continue;  
                }  
  
                kneltime += Long.valueOf(  
                        Bytes.substring(line, kmtidx, rocidx - 1).trim())  
                        .longValue();  
                usertime += Long.valueOf(  
                        Bytes.substring(line, umtidx, wocidx - 1).trim())  
                        .longValue();  
            }  
            retn[0] = idletime;  
            retn[1] = kneltime + usertime;  
            return retn;  
        } catch (Exception ex) {  
            ex.printStackTrace();  
        } finally {  
            try {  
                proc.getInputStream().close();  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
        }  
        return null;  
    }  
    
}


 
/*
解決 String.subString() 處理中文的問題 (將中文試為一個byte)
 */
package cpu_use;

/**
 *
 * @author bert
 */
public class Bytes {
     public static String substring(String src, int start_idx, int end_idx){  
        byte[] b = src.getBytes();  
        String tgt = "";  
        for(int i=start_idx; i<=end_idx; i++){  
            tgt +=(char)b[i];  
        }  
        return tgt;  
    }
}


 
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package cpu_use;

/**
 *
 * @author bert
 */
public class CPU_Useage {
     public static void main(String args[])  
    {  
        MonitorServiceImpl MSImpl = new MonitorServiceImpl();  
        try {  
            Thread.sleep(MonitorServiceImpl.CPUTIME);  
            MonitorInfoBean bean = MSImpl.getMonitorInfoBean();  
            System.out.println("系統: "+bean.getOsName());  
            System.out.println("CPU使用率: "+bean.getCpuRatio()+"%");  
            System.out.println("JVM可使用記憶體: "+String.valueOf(bean.getTotalMemory()/1000.0)+" MB");  
            System.out.println("JVM尚餘記憶體: "+bean.getFreeMemory()/1000.0+" MB");  
            System.out.println("JVM最大可配置記憶體: "+bean.getMaxMemory()/1000.0+" MB");  
            System.out.println("============================");  
            System.out.println("實體記憶體: "+bean.getTotalMemorySize()/1000.0+" MB");  
            System.out.println("實體記憶體可用: "+bean.getFreePhysicalMemorySize()/1000.0+" MB");  
            System.out.println("已使用實體記憶體: "+bean.getUsedMemory()/1000.0+" MB");  
            System.out.println("============================");  
            System.out.println("Total Thread in Java: "+bean.getTotalThread());  
        } catch (Exception e) {           
            e.printStackTrace();  
        }
    }  
}


執行後如下

2015年3月25日 星期三

【分享】創意包裝

朋友送給我的禮物,包裝很有創意.

[Python] Python Http Post

之前寫過一篇使用Python 取得網頁原始碼  ,這一篇來補充一下如何post 資料。

今天我們來練習一下怎麼post資料,我們會另外寫一個PHP 來顯示我們所post的資料。

PHP並不是本篇的重點,所以不會PHP也不要擔心。

Python程式碼
 import requests  
 m_code='B025492100'  
 payload = {'name': 'bachi', 'blog': 'http://boywhy.blogspot.tw/'}  
 res = requests.post("http://192.168.1.203/test.php", data=payload)  
 print(res.text)  

網上的範例Post是用params
 res = requests.post("http://192.168.1.203/test.php", params=payload)  

但我試了很多次,php都接收不到Post上去的參數,後來爬文才知應該改用data,感恩。
http://stackoverflow.com/questions/15461616/post-method-in-python-using-requests

附上顯示所有Post參數php code

 <?php  
 foreach ($_POST as $key => $value)  
 echo "key:".htmlspecialchars($key)." vale:".htmlspecialchars($value)."  ";  
 ?>  

執行結果

[Crystal Report] ReportDocument.PrintOptions.PrinterName 設定值無效

近日遇到一個怪事,多個報表共用同一段列印程式碼,

但其中一個報表無論選擇那一個印表機,都會丟到預設印表機。

用程式檢查ReportDocument.PrintOptions.PrinterName 發現是空值,

,其他報表的設定ReportDocument.PrintOptions.PrinterName 都是正常的,

懷疑是報表先生的問題,請高人同事對報表先生搜身,發現了一個地方



















若是在這裡打勾,有很大的機會發生,無論選那一台印表機都會丟到預設印表機。




























把勾勾拿掉,就一切正常。

2015年3月24日 星期二

[OpenSuse] whereis 指令

whereis 指令其實和locate一樣都是搜尋 /var/lib/locatedb 裡

的資料,差異在whereis 可以搭配下表的參數,限定只搜尋符合

的特殊檔案。


參數
說明
-b
搜尋時以二進位檔案為主要的搜尋對象。
-m
針對手冊頁路徑下的檔案進行搜尋。
-s
只搜尋原始碼來源的檔案。
-u
針對檔案不具備說明檔案的相關檔案進行搜尋。


搜尋符合passwd的檔案:

whereis passwd








搜尋符合passwd的二進位檔案:

whereis -b passwd











搜尋符合passwd並且為原始碼檔案

whereis -s passwd






空白表示系統上並沒有符合此條件的檔案。


以上資料來源為

一次擁有Linux雙認證:LPIC Level 1+Novell CLA11自學手冊(第二版)


作者: 楊振和 
國際書號(ISBN): 9789572242162 
出版社: 松崗 

[OpenSUSE] locate 指令

locate 指令的操作結果,類似find搭配-name參數的運作。


locate 指令是用來搜尋/var/lib/locatedb 內預先儲存好的檔案路徑資料庫,

這個資料內的檔案路徑清單會在每日自動透過排程器來更新,或是亦可透過

root身份來執行updatedb來進䈩手動更新作業。


預設的情況下,locate指令可能不會安裝,例如我使用OpenSuse 11.4就沒有。

可以用root身份執行 zypper in findutils-locate

以下是實際操作截圖






















locate指令無論用何種身份,搜尋的資料庫皆為同一個。


用法如下,假如我今天要找與passwd相關的檔案名稱:

locate passwd


































以上資料來源為

一次擁有Linux雙認證:LPIC Level 1+Novell CLA11自學手冊(第二版)


作者: 楊振和 
國際書號(ISBN): 9789572242162 
出版社: 松崗 

【分享】布落貨價卡

同事印給我的.

2015年3月23日 星期一

[小技巧]查看您手上的PL-2303晶片是那一個版本

1.插上PL-2303 USB (記得要先灌驅動)。

2.查看你的PL-2303是在那一個連接port。


























以我的電腦而言是在COM1。

3.到這裡 PL2303_Prolific_DriverInstaller_v1.8.0.zip
http://www.prolific.com.tw/TW/ShowProduct.aspx?p_id=226&pcid=79





















下載後,解壓縮
解壓縮後,點選checkChipVersion_v1006

















開啟主畫面後,選擇好COM PORT ,然候按下Check














噹噹噹~型號就出來了

[Java] 用JNA 呼叫C的函式

參考資料來源

http://teddy-chen-tw.blogspot.tw/2009/07/javanative-code.html


Java中我們可以透過JNI(Java Native Interface) 來呼叫DLL或是Linux裡的lib檔案,

JNA(Java Native Access),可以讓我們簡化JNI的操作,讓它就像呼叫函式一樣簡單,不

必自己再去弄一個head檔出來。


1. 首先到這裡下載JNA,點選右下角的Download ZIP

https://github.com/twall/jna





















2.把ZIP檔解壓縮


3.開啟Netbeans ,新建一個Java專案。





























4.把剛才的JNA加入Libraries (jna-master/dist/jna.jar)










































5.點選Files










6.新增一個資料夾叫lib











































7.把jna.jar複制到lib資料夾中












8.程式碼如下

 
package jna.test;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;

/**
 *
 * @author 北七部落
 */
public class JNATest {

    //JNA所需要的介面
    public interface C_Library extends Library
    {
        //先判別系統是否為windows,windows需要呼叫msvcrt,linux則呼叫C
        String os_c=Platform.isWindows()?"msvcrt":"c";
        //初始化實體(載入所需要的dll,msvcrt.dll or c.lib)
        C_Library INSTANCE=(C_Library)
                Native.loadLibrary(os_c, C_Library.class);
        
        /* 要用到的C語言函式,在C語言中是這樣定義
         *  printf(格式化輸出數據)
            相關函數
            scanf,snprintf
            表頭文件
            #include
            定義函數
            int printf(const char * format,.............);
            函數說明
            printf()會根據參數format字符串來轉換並格式化數據,
            然後將結果寫出到標準輸出設備,
            直到出現字符串結束('\0')為止。
         *  資料來源 
            http://people.cs.nctu.edu.tw/~yslin/library/
            linuxc/main.htm
         *  要用用Java的資料型態去對應。
         */
        int printf(String format ,Object... args);
    }
    
    public static void main(String[] args) {
        
        //調用C言函的print
        C_Library.INSTANCE.printf("hi,I am %s , 
        %d year old , I like this float %f\n", 
        "bert",20,3.1415);
    }    
}

9.執行結果









10.我們再來試一下呼叫一下system函式
 
package jna.test;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;

/**
 *
 * @author 北七部落
 */
public class JNATest {

    //JNA所需要的介面
    public interface C_Library extends Library
    {
        //先判別系統是否為windows,windows需要呼叫msvcrt,linux則呼叫C
        String os_c=Platform.isWindows()?"msvcrt":"c";
        //初始化實體(載入所需要的dll,msvcrt.dll or c.lib)
        C_Library INSTANCE=(C_Library)
                Native.loadLibrary(os_c, C_Library.class);
        
        /* 要用到的C語言函式,在C語言中是這樣定義
         *  printf(格式化輸出數據)
            相關函數
            scanf,snprintf
            表頭文件
            #include
            定義函數
            int printf(const char * format,.............);
            函數說明
            printf()會根據參數format字符串來轉換並格式化數據,
            然後將結果寫出到標準輸出設備,直到出現字符串結束('\0')為止。
         *  資料來源 http://people.cs.nctu.edu.tw/~yslin/library/
            linuxc/main.htm
         *  要用用Java的資料型態去對應。
         */
        int printf(String format ,Object... args);
        
        
        /*要用到的C語言函式,在C語言中是這樣定義
        system(執行shell 命令)
        相關函數
        fork,execve,waitpid,popen
        表頭文件
        #include
        定義函數
        int system(const char * string);
        函數說明
        system()會調用fork()產生子進程,由子進程來調用
        /bin/sh-c string來執行參數string字符串所代表的命令,
        此命令執行完後隨即返回原調用的進程。
        資料來源 http://people.cs.nctu.edu.tw/~yslin/library/
        linuxc/main.htm
         *  要用用Java的資料型態去對應。
        */
        int system(String shell);
    }
    
    public static void main(String[] args) {
        
        //調用C語言的system 來查詢目錄下的檔案
        String os_dir=Platform.isWindows()?"dir":"ls";
        C_Library.INSTANCE.system(os_dir);
        //調用C言函的print
        C_Library.INSTANCE.printf("hi,I am %s , %d year old , 
        I like this float %f\n", "bert",20,3.1415);
    }    
}


11.執行結果

















12.補充

msvcrt.dll是微軟在windows操作系統中提供的C語言運行庫執行文件(Microsoft C Runtime Library),其中提供了printf,malloc,strcpy等C語言庫函數的具體運行實現,並且為使用C/C++(Vc)編繹的程序提供了初始化(如獲取命令行參數)以及退出等功能。

資料來源
http://baike.baidu.com/view/665378.htm


這段程式碼我在win 7 以及mac 10.10 運行是正常的。

「Java」JSP使用健保讀卡機,取得健保卡基本資料。

JSP可以呼叫JavaBean,再透過JNA (Java Native Access) 對DLL做存取,以達成JSP與健保

專用讀卡機之間的溝通,架構圖如下:
























1. 環境說明

OS: win7 Pro

IDE:Netbean 8.2

Server: Glass Fish

Java 8

Cshis.dll 3.3版

JNA 請到這裡下載

讀卡機為HC-3000

2.要達成本篇功能,除了宏堡科技 HC-3000外,仍需要安全模組卡、醫事人員卡、健保VPN

網路,以上設備感謝相關人士幫助,此為本人自行研究,歡迎轉載,但禁止商用

3.請先進行以下3個動作。

 3.1 切換到File,建立一個lib資料夾。












 3.2 把Cshis.dll丟到專下裡。













3.3 把jna.jar加入到Library中。















4.先來寫一下JavaBean,新建一個ReadBean.java

 
package com.test.readcard;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.ptr.IntByReference;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ReadBean implements java.io.Serializable 
{
    public ReadBean(){}
    String Basic;
    public interface CLibrary extends Library
   {
       /*
       CLibrary INSTANCE=(CLibrary) Native.loadLibrary((Platform.isWindows()? "msvcrt":"c"),CLibrary.class);
       
       void printf(String fromat,Object... args);*/
       CLibrary INSTANCE=(CLibrary) Native.loadLibrary(("CsHis"),CLibrary.class);
       //開啟COM Port
       public int csOpenCom(int comport);
       //關閉COM Port
       public int csCloseCom();
       //驗證安全模組卡
       public int csVerifySAMDC();
       //驗證醫事人員卡密碼
       public int hpcVerifyHPCPIN();
       //取得健保卡基本資料
       public int hisGetBasicData(byte[] buffer, IntByReference  size);
   
   }
    public String getBasic()
    {
        //Init 需要用到的class
        basicStruct bs=new basicStruct();;
        HisGetTreatmentNeedHPCStruct hn=new HisGetTreatmentNeedHPCStruct();        
        //開啟開COM Port (我是接在COM1)
        int err=CLibrary.INSTANCE.csOpenCom(0);
        //驗證安全模組卡
        CLibrary.INSTANCE.csVerifySAMDC();
        //驗證醫事人員卡
        CLibrary.INSTANCE.hpcVerifyHPCPIN();                
        //取得基本資料
        err=CLibrary.INSTANCE.hisGetBasicData(bs.basicdatabuffer, bs.size);
        StringBuilder sb=new StringBuilder();
        if (err==0)
        {
            
            byte[] tmp=Arrays.copyOfRange(bs.basicdatabuffer,0,11);
            try {
                String cardno = new String(tmp, "UTF-8");
                tmp=Arrays.copyOfRange(bs.basicdatabuffer,12,20);
                String name = new String(tmp, "big5");
                tmp=Arrays.copyOfRange(bs.basicdatabuffer,32,42);
                String pid = new String(tmp, "big5");
                tmp=Arrays.copyOfRange(bs.basicdatabuffer,42,49);
                String birth = new String(tmp, "big5");
                System.out.println(cardno);
                System.out.println(name);
                System.out.println(pid);
                System.out.println(birth);
                sb.append(cardno+",");
                sb.append(name+",");
                sb.append(pid+",");
                sb.append(birth);
            } catch (UnsupportedEncodingException ex) {
                Logger.getLogger(ReadBean.class.getName()).log(Level.SEVERE, null, ex);
            }
        }        
        err=CLibrary.INSTANCE.csCloseCom();        
    
        Basic= sb.toString();
        
        return Basic;
}
}
class basicStruct
{
    byte[] basicdatabuffer = new byte[72];    
    IntByReference  size=new IntByReference(72);
}
class HisGetTreatmentNeedHPCStruct
{
    byte[] basicdatabuffer = new byte[498];
    IntByReference  size=new IntByReference(498);
}


注意一件事,JavaBean一定要有Package Name,不然JSP會找不到。

接下來是JSP的部份
 <%--   
   Document  : Read  
   Created on : 2015/3/21, 上午 10:54:57  
   Author   : bert  
 --%>  
 <jsp:useBean id="ReadBean" class="com.test.readcard.ReadBean" scope="page"/>  
 <%@page contentType="text/html" pageEncoding="UTF-8"%>  
 <!DOCTYPE html>  
 <html>  
   <head>  
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
     <title>Read Card Test</title>  
   </head>  
   <body> <% String message;  
   message=ReadBean.getBasic();  
 String temp[]=message.split(",");  
 %>         
 卡號:<%out.print(temp[0]);%>  
 姓名:<%out.print(temp[1]);%>  
 身份證:<%out.print(temp[2]);%>  
 生日:<%out.print(temp[3]);%>  
   </body>  
 </html>  

注意一件事,因為這只是一個實驗性質,所以我把認證安全模組卡以及醫事人員卡寫在一起,所以每次都會去認證,會比較花時間,如果有需要的人,請注意一下這一點。

執行結果(我用黑筆隱形部份個資)

2015年3月20日 星期五

[Postgresql] Visual Studio 以ODBC 資料連接Postgresql

環境說明

A.Win7 專業版 64bit

B. Vistual Studio 2012

C. Postgrsql 9.1.3 x86版本


1.開啟Applaction Stack Builder




























2.選擇Postgresql 伺服器


























3.安裝ODBC驅動


4.點選Next


5.下載ODBC驅動中


























6.點選Next開始安裝


























7.點選Next

























8.點選Next

























9.點選Next

























10.安裝中,稍候一下。

























11.安裝完成,點選Finish。

























12.點選Finish。

13.來到C:\Windows\SysWOW64 下找到odbcad32.exe ,點二下。


14.點選新增






















15.點選PostgreSQL ODBC Driver(UNICODE)


















16.設定相關資料後按下Test。
















17.看到這個畫面代表連線成功,設定是正確的,請點下確定。












18.點下Sava儲存此設定。
















19.點選右上角X 關掉這個畫面。






















20.開啟Vistual Studio ,點選伺服器總管,『加入資料連接』。
21.選擇Microsoft ODBC資料來源,點選繼續。



















22.選擇剛才新增的Postgresql_Demo,按下確定。





























23.現在可以看到資料連接多出了剛才新增的PostgreSQL連接。