2015年5月31日 星期日

「Linux」切換使用的JDK以及JRE

有時候系統會預先安裝了OpenJDK,此時如果再安裝了Oracle JDK,

預設還是還是不會改變,需要用以下方法


 1.先切換成root

 su -l


2.切換預設JRE


/usr/sbin/alternatives --config java



像我想要用JDK 1.8 所帶的JRE ,我就必須輸入4後按Enter


3.切換JDK




















/usr/sbin/alternatives --config javac













我要用Oracle JDK 所以輸入 2 按下Enter 


運作環境: 

Oracle Linux Server release 6.6

參考來源:








「Linux」 Apache 目前連線數

ps aux | grep httpd | wc -l

[linux] sshpass

基本上sshpass是一個讓你在使用ssh或scp的情況下,無須以鍵盤輸入密碼的東西 。

使用範例如下:

sshpass -p 'mypassword' ssh username@my.linux.host

sshpass -p 'mypassword' scp username@my.linux.host:/path/to/file ./


注意一件事,sshpass並非是預設裝在linux中的指令,須要額外安裝。



參考來源:




安裝參考:

[小技巧] 在linux上用wget下載JDK

以往下載JDK必須要Accept License Agreement 才能下載,遇到文字介面的linux就

只好傻傻的用別台去下載再傳上去。

後來被高人點了一下後發現, 其實wget本身就很威,可以自己忽略這個Accept。


wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u45-b14/jdk-8u45-linux-x64.rpm



參數說明

--no-check-certificate  :  不檢驗伺服器的憑證

--no-cookies : 不使用cookie

2015年5月30日 星期六

[JAVA]取得目前使用中的網卡mac

 
package getmac;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
 *
 * @author flowercatswets
 */
public class GetMac {
    public static void main(String[] args) {
        byte[] mac;
        try {
            //取得本機的IP
            InetAddress address = InetAddress.getLocalHost();
            //依據取得的IP取得網卡
            NetworkInterface ni = NetworkInterface.getByInetAddress(address);
//取出網卡mac
            mac = ni.getHardwareAddress();
            //把網卡mac格式化輸出 xx-xx-xx-xx-xx-xx
            for (int i = 0; i < mac.length; i++) {
                    System.out.format("%02X%s", mac[i], (i < mac.length - 1) ? "-"
                                    : "");
            }
            System.out.print("\n");           
        } catch (UnknownHostException | SocketException ex) {
            Logger.getLogger(GetMac.class.getName()).log(Level.SEVERE, null, ex);
        }
    }    
}

參考來源:
https://code.google.com/p/rogued/source/browse/trunk/src/DHCPUtility.java?r=6

[玩具]USB電壓、電流檢測表

今天和嘛吉去電腦街時,嘛吉覺得這玩意兒俺一定有興趣,賓果~俺敗下去了,

特價99,買來試一下也不錯。












































看標示可以支援3.5V ~ 7.0V 的電壓,用來USB上應相當足夠。

電流則是1~3A,一般的USB充電是1A ,平板的充電插頭有些是2A。

一般USB 2.0 的供電約在0.5A左右。

觀察了一下發現,其實大致上充電器以及小米行動電源都能輸出5~5.1V

的電壓,但電流則是視裝置的不同,並不是插頭餵多少,裝置就吃多少,

同一顆插頭,同一條線,接平板吃400多mA ,接手機吃600多mA。

換到小米行動電源上亦同。












































它不需要任何操作,通電後每隔幾秒會輪流切換電壓及電流。









2015年5月29日 星期五

[小技巧] Gmail收外部信遇到Line length exceeded limit: Line too long

據網路上查到的原因,是因為外部信箱中可能有較大的附加檔案,

GMAIL 只能接受小於25MB的附加檔案,超過的話是無法接收的喔。


解法如下: 

1. 將外部信箱中超過25MB的信件附檔另除後刪除。


若還是無效。


2.刪除外部信箱帳號重新建立一次。



參考文件:

[Linux]千萬別讓root可以遠端登入

今天登入伺服器後,切到root身份後,看到驚人的訊息

原來一直有人嘗試要登入這台伺服器的root帳號,但當年公司的MIS 高手,把root關閉

遠端登入,即使它猜對了root的密碼,從遠端也無法登入,一定要用一般帳號登入後,

才能切成root。

2015年5月25日 星期一

[Mac] zip指令壓縮

zip壓縮logs資料夾內所有檔案


zip logs.zip logs/*

記得最後那個* 一定要打,不然會只有壓一個空的資料夾進去zip檔中。


zip解壓縮


unzip logs.zip 

2015年5月24日 星期日

[Java]Socket

認識SOKET

Socket Library是BSD UNIX的一個API (Application Programming Interface),


Socket兩個互相溝通的程序(process)之間的任一端點。

此兩個process可同屬一電腦系統之內,或分屬於兩個不同的電腦系統透過網路來溝通。


使用目的:網路應用程式設計者不需處理網路下層(傳輸層、網路層)的工作,而專注於其本身

(應用層)的程式設計。

























JAVA 在使用SOCKT 時,有二種常用的方式

1.TCP: 它就像是雙掛號,對方沒有收到就會不斷嘗試再送給對方,

直到使用者中止或是俞時。



2.UDP : UDP則是類似一般的平信,通常都會送達,但還是會有不見的時候,但成本便宜,
     
                  無須等待對方回應即可繼續傳送。
     
               (看過海角七號就知道)


Java TCP 的流程圖

伺服端ServerSocket 等待使用者的Socket來做連線,並取得輸出入通道。
























MyServerSocket.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class MyServerSocket {
        //宣告區
	ServerSocket server;
	ObjectInputStream in;
	ObjectOutputStream out;
	BufferedReader buffer;
	Thread inputThread;
	Thread recThread;
	boolean isClose = false;
	Socket client;
	public MyServerSocket() {
		try {
                      //ServerSocket Listen 在本機的5678 port
			server = new ServerSocket(5678);
                      //輸出己啟動伺服器資訊
			System.out.println("伺服器啟動於 : "
					+ InetAddress.getLocalHost().getHostAddress() + ":"
					+ server.getLocalPort());
                         //把連線過來的Client端交由另一個socket處理
			client=server.accept();
                    //輸出訊息己有使用者連進來
			System.out.println("Client is connected");
                      //將Server端的標準輸出入設為鍵盤
			buffer=new BufferedReader(new InputStreamReader(System.in));
                      //取得與此使用者的輸出管道
			out=new ObjectOutputStream(client.getOutputStream());
                       //取得與此使用者的輸入管道
			in=new ObjectInputStream(client.getInputStream());
			
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		//用一個執行序負毒處理接收到的訊息
		recThread = new Thread(new Runnable() {

			@Override
			public void run() {
				recMessage();
			}
		});
                //啟動接收訊息執行序
		recThread.start();
                //使用一個執行序來處理Server端的鍵盤輸入
		inputThread = new Thread(new Runnable() {

			@Override
			public void run() {
				keyin();

			}
		});
                //啟動server端輸入執行序
		inputThread.start();
	}
      //Server端鍵盤處理函式
	private void keyin() {
		try {
			String line;

			while (!(line = buffer.readLine()).equals("-1")) {
				System.out.println("傳送:" + line);
				write(line);
				Thread.sleep(100);

			}
			isClose = true;
			close();

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
        //接收訊息處理函式
	private void recMessage() {
		String recText = "";
		while (!isClose) {
			try {

				recText = in.readUTF();
				System.out.println("接收:" + recText);
				Thread.sleep(100);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
        輸出資料到client端函式
	private void write(String text) {
		try {
			out.writeUTF(text);
			out.flush();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	private void close() {
		try {

			recThread.interrupt();
			inputThread.interrupt();
			out.flush();
			out.close();
			in.close();
			client.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
	//主程式
	public static void main(String arg[])
	{
		new MyServerSocket();
	}
}


MySocket.java
import java.io.IOException;
import java.net.Socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.UnknownHostException;

public class MySocket {

	Socket client;

	ObjectInputStream in;
	ObjectOutputStream out;
	BufferedReader buffer;
	Thread inputThread;
	Thread recThread;
	boolean isClose = false;

	public MySocket() {
		String ServerIP = "127.0.0.1";
		try {
			client = new Socket(ServerIP, 5678);
			in = new ObjectInputStream(client.getInputStream());
			out = new ObjectOutputStream(client.getOutputStream());
			buffer = new BufferedReader(new InputStreamReader(System.in));
		} catch (IOException e) {
			e.printStackTrace();
		}

		recThread = new Thread(new Runnable() {

			@Override
			public void run() {
				recMessage();
			}
		});

		recThread.start();

		inputThread = new Thread(new Runnable() {

			@Override
			public void run() {
				keyin();

			}
		});

		inputThread.start();
	}

	private void keyin() {
		try {
			String line;

			while (!(line = buffer.readLine()).equals("-1")) {
				System.out.println("傳送:" + line);
				write(line);
				Thread.sleep(100);

			}
			isClose = true;
			close();

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	private void recMessage() {
		String recText = "";
		while (!isClose) {
			try {

				recText = in.readUTF();
				System.out.println("接收:" + recText);
				Thread.sleep(100);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	private void write(String text) {
		try {
			out.writeUTF(text);
			out.flush();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	private void close() {
		try {

			recThread.interrupt();
			inputThread.interrupt();
			out.flush();
			out.close();
			in.close();
			client.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	public static void main(String args[]) {
		new MySocket();
	}
}



Java UDP 流程圖



















直接傳送過去,並沒有任何的驗證機制。

UDPServer.java
import java.io.IOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

import java.net.SocketException;

import java.net.UnknownHostException;



public class UDPServer {

	boolean isClose = false;

	byte[] Bytebuffer = new byte[65507];

	DatagramPacket dp = new DatagramPacket(Bytebuffer, Bytebuffer.length);

	DatagramSocket ds;

	Thread recThread;



	public UDPServer() {

		try {



			ds = new DatagramSocket(5678);

			System.out.println("伺服器啟動於 : "

					+ InetAddress.getLocalHost().getHostAddress() + ":"

					+ ds.getLocalPort());

			recThread = new Thread(new Runnable() {



				@Override

				public void run() {

					recMessage();

				}

			});



			recThread.start();



		} catch (SocketException e) {

			e.printStackTrace();

		} catch (UnknownHostException e) {

			e.printStackTrace();

		}

	}



	private void recMessage() {

		try {

			String msg = "";

			while (!isClose) {

				ds.receive(dp);

				msg = new String(dp.getData(), 0, dp.getLength());

				System.out.println("傳來的訊息 : " + msg);

				Thread.sleep(100);

			}

		} catch (IOException e) {

			// TODO Auto-generated catch block

			e.printStackTrace();

		} catch (InterruptedException e) {

			// TODO Auto-generated catch block

			e.printStackTrace();

		}

	}

	public static void main(String args[]) {

		new UDPServer();

	}



}


UDPClient.java

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

import java.net.SocketException;

import java.net.UnknownHostException;



public class UDPClient {

	DatagramPacket dp;	

	DatagramSocket ds;

	Thread inputThread;

	BufferedReader buffer;

	public UDPClient() {

		System.out.println("請輸入要傳送的訊息 : ");

		String msg = "Key in";

		buffer = new BufferedReader(new InputStreamReader(System.in));

		try {

			ds=new DatagramSocket();

		} catch (SocketException e) {

			// TODO Auto-generated catch block

			e.printStackTrace();

		}

		inputThread = new Thread(new Runnable() {



			@Override

			public void run() {

				keyin();

			}

		});



		inputThread.start();

	}



	private void keyin() {

		try {

			String line;



			while (!(line = buffer.readLine()).equals("-1")) {

				System.out.println("傳送:" + line);

				write(line);

				Thread.sleep(100);

			}

		} catch (IOException e) {

			

			e.printStackTrace();

		} catch (InterruptedException e) {			

			e.printStackTrace();

		}

	}



	private void write(String text) {

		try {

			dp = new DatagramPacket(text.getBytes(), text.getBytes().length,

					InetAddress.getByName("127.0.0.1"), 5678);



			ds.send(dp);

		} catch (UnknownHostException e) {

			// TODO Auto-generated catch block

			e.printStackTrace();

		} catch (IOException e) {

			// TODO Auto-generated catch block

			e.printStackTrace();

		}

	}

	

	public static void main(String args[])

	{

		new UDPClient();

	}

}



參考資料:

https://sites.google.com/a/mis.nsysu.edu.tw/cheng-shi-zi-xun-wang/java-jin-jie-pian/wang-lu-pian/1-shen-me-shisocket

部份圖片來自網路,若有侵權請來信告知。

[C#] 以IE開啟雲端藥歷(首頁版)

程式碼如下

 System.Diagnostics.Process.Start("iexplore.exe", "https://10.253.253.245/imme0000/IMME0002S01.aspx");  















成功進入雲端藥歷首頁,BUT 俺沒有接健保讀卡機啦~所以才會顯示這個訊息。

2015年5月21日 星期四

[名詞定義]Cpputest 是什麼,可以吃嗎?

官網的介紹

CppUTest is a C /C++ based unit xUnit test framework for unit testing and for test-

driving your code. It is written in C++ but is used in C and C++ projects and 

frequently used in embedded systems.

小弟自己翻一下: 

CppUTest 是一個 C /C++ 下的單元測試框架,可以對你的程式碼做測試驅動開發

CppUTest 是用C++寫的,也常被用在C以及C++ 專案上,更頻繁的被使用於嵌入式系統。

CppUTest支援 memory leak detector ,這對沒有記憶體管理的C/C++ 是一大福音。


名語說明: 

測試驅動開發(Test-driven development)是極限編程中倡導的程序開發方法,以其倡導先寫測試程序,然後編碼實現其功能得名。

資料來源:


[分享]看起來簡單的程式

把複雜的程式邏輯,用很簡單易用的UI包覆起來,是一種藝術,亦是吾人一生所追求。

每一個系統,皆是由一個一個的function組織而成,包含了工程師的熱情與技術。

[C#] 賓果遊戲

近日同事被ㄠ要寫一個賓果遊戲,小弟這個鍵人,就寫了個範例自己做參考。

單純是人和人用來玩用的,沒有連線、AI功能。

一打開程式的樣子




























3連線了





























完整程式碼

 using System;  
 using System.Collections.Generic;  
 using System.ComponentModel;  
 using System.Data;  
 using System.Drawing;  
 using System.Linq;  
 using System.Text;  
 using System.Threading.Tasks;  
 using System.Windows.Forms;  
 namespace WindowsFormsApplication14  
 {  
   public partial class Form1 : Form  
   {  
     public Form1()  
     {  
       InitializeComponent();  
       reSet();  
     }  
     //用來裝Button的限列  
     Button[] btn = new Button[25];  
     //用來新增賓果用的Button  
     Button newBtn;  
     //計算Button位置用  
     int count = 0;  
     //設算Buton在那一行  
     int column = 0;  
     //計算Button在那一列  
     int row = 0;  
     //是否做過第一次初始化(加入25個按鈕)     
     bool first_init = false;  
     //紀錄點下的按鈕  
     int[] click_btn = new int[25];  
     //是否已連線  
     bool haveline;  
     /// <summary>  
     /// 重設遊戲  
     /// </summary>  
     private void reSet()  
     {  
       haveline = false;  
       if (!first_init)  
         initButtion();  
       else  
         initButtionSecond();  
       getRandom();  
     }  
     /// <summary>  
     /// 第一次初始化Button陣列  
     /// </summary>  
     private void initButtion()  
     {  
       for (int i = 0; i < 25; i++)  
       {  
         Button newBtn = new Button();  
         newBtn.Location = new Point(12 + (column * 75), 75 + ((row - 1) * 75));  
         newBtn.Text = (count + 1).ToString();  
         newBtn.Size = new Size(75, 75);  
         newBtn.TabIndex = count + 1;  
         newBtn.Click += click_evn;  
         newBtn.Name = i.ToString();  
         btn[i] = newBtn;  
         this.Controls.Add(newBtn);  
         count += 1;  
         column += 1;  
         if (count % 5 == 0)  
         {  
           column = 0;  
           row += 1;  
         }  
       }  
       first_init = true;  
     }  
     //重設Button  
     private void initButtionSecond()  
     {  
       for (int i = 0; i < 25; i++)  
       {  
         btn[i].BackColor = default(Color);  
         btn[i].Enabled = true;  
         btn[i].UseVisualStyleBackColor = true;  
         click_btn[i] = 0;  
       }  
     }  
     //Button陣列按鈕事件  
     private void click_evn(object sender, EventArgs e)  
     {  
       if (!haveline)  
       {  
         Button btn = (Button)sender;  
         btn.Enabled = false;  
         click_btn[Convert.ToInt32(btn.Name)] = 1;  
         haveline = checkLink();  
         if (haveline)  
           MessageBox.Show("You Win");  
       }  
     }  
     //產生1~25不重覆亂數  
     private void getRandom()  
     {  
       Random r = new Random();  
       int[] num = new int[25];  
       for (int i = 0; i < 25; i++)  
       {  
         num[i] = i + 1;  
       }  
       int temp;  
       for (int i = 0; i < 25; i++)  
       {  
         int R = r.Next(25);  
         temp = num[i];  
         num[i] = num[R];  
         num[R] = temp;  
       }  
       for (int i = 0; i < 25; i++)  
       {  
         btn[i].Text = num[i].ToString();  
       }  
     }  
     /// <summary>  
     /// 檢查是否有連線  
     /// </summary>  
     /// <returns>true (3條連線) / false 未滿3條 </returns>  
     private bool checkLink()  
     {  
       //目前有幾條連線  
       int totalLine = 0;  
       //是否已達成3條連線  
       bool haveLine = false;  
       //判斷橫五公格  
       for (int i = 0; i < 5; i++)  
       {  
         if (click_btn[0 + i * 5].ToString() + click_btn[1 + i * 5].ToString() + click_btn[2 + i * 5].ToString() + click_btn[3 + i * 5].ToString() + click_btn[4 + i * 5].ToString() == "11111")  
         {  
           for (int j = 0; j < 5; j++)  
           {  
             btn[j + i * 5].BackColor = Color.Pink;  
           }  
           totalLine += 1;  
         }  
       }  
       //判斷直五公格  
       for (int i = 0; i < 5; i++)  
       {  
         if (click_btn[i].ToString() + click_btn[5 + i].ToString() + click_btn[10 + i].ToString() + click_btn[15 + i].ToString() + click_btn[20 + i].ToString() == "11111")  
         {  
           for (int j = 0; j < 5; j++)  
           {  
             btn[j * 5 + i].BackColor = Color.Pink;  
           }  
           totalLine += 1;  
         }  
       }  
       //判斷斜線\  
       if (click_btn[0].ToString() + click_btn[6].ToString() + click_btn[12].ToString() + click_btn[18].ToString() + click_btn[24].ToString() == "11111")  
       {  
         for (int j = 0; j < 5; j++)  
         {  
           btn[j * 6].BackColor = Color.Pink;  
         }  
         totalLine += 1;  
       }  
       //判斷斜線/  
       if (click_btn[4].ToString() + click_btn[8].ToString() + click_btn[12].ToString() + click_btn[16].ToString() + click_btn[20].ToString() == "11111")  
       {  
         for (int j = 1; j < 6; j++)  
         {  
           btn[j * 4].BackColor = Color.Pink;  
         }  
         totalLine += 1;  
       }  
       //是否達成3連線  
       if (totalLine >= 3)  
         haveLine = true;  
       return haveLine;  
     }  
     /// <summary>  
     /// 重設按鈕事件  
     /// </summary>  
     /// <param name="sender"></param>  
     /// <param name="e"></param>  
     private void button1_Click(object sender, EventArgs e)  
     {  
       reSet();  
     }  
   }  
 }  

[C#] 改變Button的BackColor 後如何回復預設

把Buton背景色改變的程式嗎如下










執行結果























回復預設


執行結果



















怎麼好像怪怪的,跟原來的Button樣子不太一樣

查閱資料後,才知道,要補上一個











當您修改BackColor時,UseVisualStyleBackColor會自動被設為false,所以需要將其設回true。


參考資料:

http://stackoverflow.com/questions/10569200/how-to-reset-to-default-button-backcolor



2015年5月20日 星期三

[分享]QNO_qvf8027 一般網路與健保VPN雙路由設定

1.     輸入網址,通常是192.168.x.1 並輸入密碼,如下圖所示。


2.     設定WAN (我們將WAN1放置ADSLWAN2放置健保VPN網路)



3.     協定綁定第1順位(10.x.x.x的網址走健保VPN出去)



4.     協定綁定第2順位(如果不符合第一個條件的都走ADSL出去)



5.     如果有需要開啟DHCP



6.     防火牆設定,記得不回應廣域網路端請求  必須關閉。

7.     虛擬伺服器,如果有需要連到內網的服務。(IPPort記得改成對應的



8.     PPTP 記得開,在外面過卡的藥師才能連的進來認證讀卡機,設定一下帳號密碼。(※使用MPPE加密千萬千萬千萬不要勾,不然會卡到無怨無悔)



9.     在需要戶外過卡的電腦設定一個新的VPN連線(windows 7)

10.連線到工作地點



11.    建立一個新連線。


12.使用我的網際網路連線(VPN)



13.打上俠諾的IP,取個好記的名字。



14.    輸入剛才在俠諾設定的帳密後按下連線






15.    趕快按下跳過。(因為我們不要加密,但預設連線如果沒有加密就會連不上去)



16.    關閉它





17.    在右下角網路的地方找到剛才建立的VPN點選右鍵→內容。





18.    將安全性調整如下圖後按確定。





19.    開心連線去








21.    也確認一下普通網路也是優的。