顯示具有 Java 標籤的文章。 顯示所有文章
顯示具有 Java 標籤的文章。 顯示所有文章

2009/07/03

反組譯 Java bytecode

最近做壞事,跑去下載了別人的 JAR 檔查資料,JAR 即使解壓縮以後裡面還是二進位的 bytecode,要從中找到帳號密碼實在是海底撈針。

後來找到一個軟體:DJ Java Decompiler,反組譯以後可讀性還是很高,變數名稱都還在,不過反組譯以後關鍵字的色彩標記有點問題,有時候可能會出現怪怪的程式片段,不過完整性很高可以不用擔心。



從 Tools => Decompile more files 可以一次反組譯某資料夾下的多個 bytecode。如果程式有包含中文字,記得要多選取一個選項「Convert Unicode strings to ANSI strings」,這樣中文就不會變成二進位碼。

2009/06/06

Java 密碼存取

之前程式需要儲存帳號密碼,不過發現 Java 即使 compile 成 byte code 以後密碼還是明文,serialized 以後也可以看的到,問了一下才知道怎麼處理。

處理密碼時直接在 getter() 和 setter() 做編碼和解碼,目前想用 RSA 實作:
class Password {
   String password;

   public void setPassword(String in){
      password = RSA(in);
   }

   public String getPassword(){
      return RevertFromRSA(password);
   }
}

雖然目前知道可以用 java.security.MessageDigest 物件處理,但還沒看 API 就先跑去找質數了... XD

看到「尋找大質數」以後,照網頁上面說的跑去計算 26972593-1,不過單單用 BigInteger 就跑了半個多小時,輸出時在呼叫 toString() 又跑到電腦當機......。還是決定不要太想不開 Orz


ps.
梅森求質數的方法是計算 2n-1,不過似乎不能找到「所有」的質數,但是可以比較簡單的找到更大的質數。之前求質數是用 6n ± 1 去計算,但是跑得也不快,等哪天開悟了在去衝。

2009/06/03

Java 變數可以用中文名稱耶

去受訓翻書的時候發現的,不過也早該想到了..... XD

class Asd
{
   public static void main(String[] args) 
   {
      String 我 = "天才";
      System.out.println(我);
   }
}

程式碼打的很心虛.......

2009/03/01

Java 抓本機 IP

Inet4Address.getLocalHost().getHostAddress()
都說不再碰 Java 了,結果筆記一大堆.... @_@a

2009/02/28

Java JFileChooser

JFileChooser 還真好用~
JFileChooser chooser = new JFileChooser();
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
chooser.setApproveButtonText("確定");
chooser.showDialog(jLabel1, null); //留 null 否則上一行的設定被覆蓋

File filePath = chooser.getSelectedFile();
if(filePath!=null && !filePath.getPath().equals("")){
jTextField1.setText(filePath.getPath());
}

2008/07/26

Java 和 SOA

這篇文章是抱怨文,和 Java、SOA 沒關係。
 
這幾天被搞到頭腦不太清楚,原因是專題要用 SOA 的模式下去實作。再怎麼說,SOA 和 OOP 一樣,都是實作上的一個方法、一個觀念,但是我不知道為什麼,上頭一直說用 Java 實作 SOA,一定要用 NetBeans、一定要用 TomCat or GlassFish。

我當然知道 SOA 要包括 BPEL 也有 WSDL,傳遞資料要用 SOAP,但是為什麼一定要用 NetBeans 寫程式?為什麼一定要用 GlassFish?難道我自己寫一個程式能支援 BPEL、能解析 WSDL,並且按照 SOAP 的規定傳遞訊息就不可以嗎?我當然知道有更快的開發方法,但是現在用這種作法,就和不懂的二進位就去寫作業系統沒有兩樣。

我非常討厭別人悶在自己的世界裡又不肯接納其他意見,甚至把他死死的想法套在我頭上:看動畫的都是死阿宅、男生就一定粗枝大葉、不聽流行音樂就不懂的欣賞..........。

「如果他能從這扇門望見日出的美景,你又何必要他走向那扇窗去聆聽鳥鳴呢?」拿點雅量出來吧!

2008/07/16

ERP 專題進度

我們的專題目前以「遞減式」開發,因為要做的東西實在太難了,而且要受要求以「SOA」方式實作系統,所以現在我們還要想辦法把「BPEL」、「WSDL」弄懂......囧

我分析經驗比較多,先衝物件導向分析,另外二位則拼命研究 SOA by NetBean。好玩的是 SOA是將系統分開,以網路互相連結,所以即使各網路節點中的 OS、程式開發環境不一樣,還是可以溝通,所以我還是繼續用我的 Eclipse ...... (拖走)

代辦事項:
  • create DB
  • 建立服務節點
  • 建立模擬資料
  • SVN
  • 物件實作
  • javadoc 

2008/07/03

求質數

今天用找質數問題來練習 Java,並且把質數範圍定到十位數之上,逼自己學 BigDecimal,順便看看 Java 可以跑多快。

Java 在四位數執行速度還蠻快的,至少沒有讓我等到睡著,但是後面就沒有那麼輕鬆了。後來想到小學習題有提到質數和「6」的關係,不過不知道為什麼國中之後就完全沒有蛛絲馬跡,乾脆拿出來跑一次看看這個理論是不是真的。

以下是 1 到 100 的質數:
1 = 6 * 0 + 1
2
3
5 = 6 * 1 - 1
7 = 6 * 1 + 1
11 = 6 * 2 - 1
13 = 6 * 2 + 1
17 = 6 * 3 - 1
19 = 6 * 3 + 1
23 = 6 * 4 - 1
29 = 6 * 5 - 1
31 = 6 * 5 + 1
37 = 6 * 6 + 1
41 = 6 * 7 - 1
43 = 6 * 7 + 1
47 = 6 * 8 - 1
53 = 6 * 9 - 1
59 = 6 * 10 - 1
61 = 6 * 10 + 1
67 = 6 * 11 + 1
71 = 6 * 12 - 1
73 = 6 * 12 + 1
79 = 6 * 13 + 1
83 = 6 * 14 - 1
89 = 6 * 15 - 1
97 = 6 * 16 + 1

以目前的狀況來看,質數都是 6 的倍數加減 1。但是不知道往後這個理論是不是還能用,點名叫 legnaleurc 證明一下好了.... XD

另外在 PTT 上有找到幾個演算法,有興趣可以去寫寫看。

Sieve of Eratosthenes @ MathWorld
http://mathworld.wolfram.com/SieveofEratosthenes.html


Prime Sieve of Eratosthenes @ Algorithmist
http://www.algorithmist.com/index.php/Sieve


2008.07.03 補充:
挖到一篇文章,裡面提到「為什麼要找質數」,理由如下:
  • 這是傳統......XD
  • 附加價值
  • 無上的榮耀
  • 對電腦的考驗
  • ..........
質數的附加價值很多,例如 RSA 加密演算法,就是利用超大質數相乘不容易因式分解,增加沒有 key 時解密的困難度,而找到超大的質數表示你你努力、很聰明,大家會對你無比的尊敬,還給你一筆很大的獎金

2007/03/08

在 Java 中讓不同的按鍵有不同的動作

通常一個視窗中會有多個不同的按鈕,點下按鈕後,按鈕會分別有不同的動作。

假設我們寫了一個 JTextArea 讓使用者輸入資料,當按下「Add Line」按鈕時會自動換行,按下「Exit」按鈕時會結束程式。




程式碼:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class panel0 {

JFrame frame = new JFrame();
JPanel panel = new JPanel();
JButton b1 = new JButton("Exit");
JButton b2 = new JButton("Add Line");
JTextArea text = new JTextArea(5,10);
JPanel panelControl = new JPanel();



public static void main(String[] arg){
panel0 gui = new panel0();
gui.go();
}

public void go(){

panel.setBackground(Color.gray);
panel.setLayout(new BoxLayout(panel,BoxLayout.Y_AXIS));

panelControl.setBackground(Color.gray);
panelControl.setLayout(new BoxLayout(panelControl,BoxLayout.X_AXIS) );

text.setLineWrap(true);
JScrollPane scroller = new JScrollPane(text);
scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

b1.addActionListener(this);
b2.addActionListener(this);

text.setText("Test string....\n");
panel.add(scroller);
panelControl.add(b2);
panelControl.add(b1);

frame.getContentPane().add(BorderLayout.CENTER,panel);
frame.getContentPane().add(BorderLayout.SOUTH,panelControl);

frame.setSize(300,300);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public void actionPerformed(ActionEvent e){
if( e.getSource() == b1 )
System.exit(0);
else
text.append("new line\n");
}

}


因為 JButton 所呼叫的 ActionListener 都會呼叫 actionPerfomed(),所以只好在此函式內判斷到底是哪個按鈕呼叫的,在依照不同的來源執行不同的動作。

public void actionPerformed(ActionEvent e){
if( e.getSource() == b1 )
System.exit(0);
else
text.append("new line\n");
}


但是這樣寫一點會使的整個程式架構混亂,尤其是按鈕需要值型的動作很複雜時,以後要維護程式碼會變的很麻煩,因此要換一個方式來做。

Java 中有個東西叫做 inner class,也就是 class 中的 class。 Inner class 可以存取 outer class 中的變數和函式,但是要注意的是 inner class 是當 outer class 被建立時才會跟著一起被建立,不會單獨存在。

這時要為每個 JButton 建議一個 inner class:

class buttonListenerEXIT implements ActionListener{
public void actionPerformed(ActionEvent e){
System.exit(0);
}
}

class buttonListenerNewLine implements ActionListener {
public void actionPerformed(ActionEvent e){
text.append("new line\n");
}
}


建立好 inner class 之後,要讓 JButton 的 ActionListener 會去呼叫寫好的函式:

b1.addActionListener(new buttonListenerEXIT());
b2.addActionListener(new buttonListenerNewLine());


改好之後,整個程式會變成這樣:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class panel0 {

JFrame frame = new JFrame();
JPanel panel = new JPanel();
JButton b1 = new JButton("Exit");
JButton b2 = new JButton("Add Line");
JTextArea text = new JTextArea(5,10);
JPanel panelControl = new JPanel();



public static void main(String[] arg){
panel0 gui = new panel0();
gui.go();
}

public void go(){

panel.setBackground(Color.gray);
panel.setLayout(new BoxLayout(panel,BoxLayout.Y_AXIS));

panelControl.setBackground(Color.gray);
panelControl.setLayout(new BoxLayout(panelControl,BoxLayout.X_AXIS) );

text.setLineWrap(true);
JScrollPane scroller = new JScrollPane(text);
scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

b1.addActionListener(new buttonListenerEXIT());
b2.addActionListener(new buttonListenerNewLine());

text.setText("Test string....\n");
panel.add(scroller);
panelControl.add(b2);
panelControl.add(b1);

frame.getContentPane().add(BorderLayout.CENTER,panel);
frame.getContentPane().add(BorderLayout.SOUTH,panelControl);

frame.setSize(300,300);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

class buttonListenerEXIT implements ActionListener{
public void actionPerformed(ActionEvent e){
System.exit(0);
}
}

class buttonListenerNewLine implements ActionListener {
public void actionPerformed(ActionEvent e){
text.append("new line\n");
}
}
}

2007/03/02

無窮迴圈之神

自從我開始研究程式設計以後,就一直會有出乎意料的無窮迴圈。昨天寫 Java 又意外的爆炸了。

程式寫好了先 compile 成 class 檔,最後在封裝成 JAR 檔。於是基於懶人的理由,自己寫了一個批次檔,這樣就不用每次修改都要慢慢打指令了。

jar cfm out.jar manifest.mf *.class *.png


用記事本打完存成 jar.bat。結果執行時居然噴了!



弄了半天,原來是因為我批次檔中的 jar 並沒有呼叫到 Java 封裝用的 jar,而是呼叫我自己寫的 jar.bat,結果就變成了無窮迴圈。

結論:我對不起我的電腦........

2007/02/26

Compile and Execute Java Programs

決定目前先不要偷懶用 Eclipse,還是用記事本慢慢 keyin 比較實在。

Java 是物件導向為主的語言,對語法上的要求也比 C++ 高出許多。首先來寫一個只有 5 行的 Hello World 程式。

public class test {
public static void main(){
System.out.println("Hello World");
}
}


存檔時記得要把檔名存成:test.java。在 Java 中,檔名是代表檔案中撰寫的 class 名稱,當檔名與程式中的 class 名稱不同時,編譯器便會出現錯誤訊息。

假設我把檔案存在 C:\Java\ 底下,現在要編譯程式時,只要在命令提示字元中鍵入:

javac c:\java\test.java


要打入絕對位址。編譯器編譯過會產生一個 test.class 檔,轉成 class 檔以後就可以執行看結果了:

java test