星期一, 4月 26, 2010

2010-04-26_Java_SL100-5

2010-04-26_Java_SL100-5

Lab: if

建立程式碼
package javaApp3;
import java.util.Scanner;
public class MyIf {

    public static void main(String[] args) {
      Scanner sc=new Scanner(System.in);
      System.out.print("input a Number: ");
      int x=sc.nextInt();
      if(x%2==0)
      {
       System.out.println(x+"是偶數");
      }
      else
          System.out.println(x+"是奇數");
      System.out.println("==================================================");
      String str=(x%2==0)?  (x+"是偶數") : (x+"是奇數") ;//如果是一個以上的字元或是字串, 使用( ) 括起來
      System.out.println(str);
      }
    }


Lab: BingoGame

建立程式碼
package javaApp3;
import java.util.*;
public class BingoGame { 

    public static void main(String[] args) {
        int rNumber=-1;
        rNumber=(int) (Math.random()*100+1);//random會介於 0 ~ 1 所以*100 + 1
        //讓他落在 1 ~ 100 之間
        //System.out.println("rNumber is = "+rNumber);//用於Debug 用產生的number

        Scanner sc=new Scanner(System.in);
        System.out.println("Input a Number: ");
        
        int guess=sc.nextInt();//將使用者輸入的數字 定為 guess 的值
        
        if(rNumber==guess)//判斷兩個數字是否相等
        {
         System.out.println("恭喜您猜對了");
         System.out.println("數值為:"+rNumber);
        }
        else
        {
         System.out.println("您猜錯了");
         System.out.println("數值為:"+rNumber);
        }
      }
}
    

Lab: switch

建立程式碼

import java.util.*;
public class MyIf3 {

    public static void main(String[] args) {
        char grade='0';
        Scanner sc=new Scanner(System.in);
        System.out.println("輸入一個數字");
        int input = sc.nextInt();
        int level = input/10;
        switch (level)
        {
            case 10:
            case 9:
            grade='A';
            break;
            case 8:
                grade='B';
                break;//跳出 switch
            case 7:
                grade='C';
                break;
            case 6:
                grade='D';
                break;
            default:
                grade='F';

        }
        System.out.println("你的成績= "+grade);
    }

}








Free Antivirus for Windows -- ClamWin

官方網站
http://www.clamwin.com/

ClamWin 是免費的 Windows 系列的防毒軟體, 也是Windows 伺服器上面( 2003/2008)少數可以用的免費防毒軟體.

ClamWin is a Free Antivirus program for Microsoft Windows 7 / Vista / XP / Me / 2000 / 98 and Windows Server 2008 and 2003.


但是要注意的是 ClamWin 沒有即時的 scanner 所以要自己排定掃描的時間.
ClamWin Free Antivirus does not include an on-access real-time scanner. You need to manually scan a file in order to detect a virus or spyware.

在Windows Server 2008 上面就可以藉由這個軟體來進行病毒的掃描與偵測.

星期五, 4月 23, 2010

2010-04-23_Java_SL100-4

2010-04-23_Java_SL100-4

Notes:
  • &&  ( and 運算)
  • ||     ( or 運算)


Lab: And 運算 與 Or 運算

建立一個程式碼如下

public class And_Or {

    public static void main(String[] args) {
        boolean b;
        int x = 3;
        int y = 3;
        b = ( x == y && y++ >= 3);//因為 x 等於 y , 所以 會執行 y++
        System.out.println("b = "+b);
        System.out.println("x = "+x);
        System.out.println("y = "+y);   // TODO code application logic here
    }

}

輸出結果

b = true
x = 3
y = 4

-----------------------------------------------------------------------------------------------------------------------

但是如果更改程式碼為

public class And_Or {

    public static void main(String[] args) {
        boolean b;
        int x = 3;
        int y = 3;
        b = ( x != y && y++ >= 3);//因為x 不等於 != y 為假, 所以就不會執行後面的 y++
        System.out.println("b = "+b);
        System.out.println("x = "+x);
        System.out.println("y = "+y);   // TODO code application logic here
    }

}

輸出結果為

b = false
x = 3
y = 3

-----------------------------------------------------------------------------------------------------------------------

修改剛剛的程式碼為

public class And_Or {

    public static void main(String[] args) {
        boolean b;
        int x = 3;
        int y = 3;
        b = ( x != y || y++ >= 3);//因為x 不等於 != y 為假, 所以就會執行後面的 y++
        System.out.println("b = "+b);
        System.out.println("x = "+x);
        System.out.println("y = "+y);   // TODO code application logic here
    }

}

輸出結果為
b = true
x = 3
y = 4

-----------------------------------------------------------------------------------------------------------------------

修改程式內容為

public class And_Or {

    public static void main(String[] args) {
        boolean b;
        int x = 3;
        int y = 3;
        b = ( x == y || y++ >= 3);//因為x 等於 == y 為真, 所以就不會執行後面的 y++
        System.out.println("b = "+b);
        System.out.println("x = "+x);
        System.out.println("y = "+y);   // TODO code application logic here
    }

}

輸出結果為

b = true
x = 3
y = 3

Lab: 位元運算

建立一個程式

public class Class0423 {

    public static void main(String[] args) {
       int x = 12;//2進位為 1100
       int y =7;  // 2進位為 0111
       int z;
       z = x & y;// z 為 x 與 y 進行2 進位的 And 運算, 為 0100
       System.out.println("z = "+z);
    }

}


輸出結果為

z = 4

-----------------------------------------------------------------------------------------------------------------------

修改程式碼 練習 XOR 互斥

public class Class0423 {

    public static void main(String[] args) {
       int x = 12;//2進位為 1100
       int y =7;  //2進位為 0111
       int z;
       z = x ^ y;// z 為 x 與 y 進行2 進位的 XOR 運算, 為 1011 互斥為1
       System.out.println("z = "+z);
    }

}

輸出結果為

z = 11

**位移運算位元**
  • >>> 只能用在正號運算上面

Lab:

public class Class042302 {

    public static void main(String[] args) {
    int x = 12;//2進位為0000001100
    int y;
    y = x>>1;//12 往右移動 1位元 就等於 12/2
    System.out.println("y = "+y);
    y = x>>2;//12 往右移動 2位元 就等於 12/4 2的2次方
    System.out.println("y = "+y);
    y = x>>3;//12 往右移動 3位元 就等於 12/8 2的3次方
    System.out.println("y = "+y);
        // TODO code application logic here
    }

}

輸出結果為

y = 6
y = 3
y = 1

-----------------------------------------------------------------------------------------------------------------------

Notes:
  • x += y; --> x=x+y;
  • x -= y;  --> x=x-y;
  • x *= y; --> x=x*y;
  • x /=y;  --> x=x/y;
  • x %=y; --> x=x%y;


Lab: Scanner

 建立一段程式碼

import java.lang.*;
import java.util.*;
public class MyInput {

    public static void main(String[] args) {
     
     Scanner sc;
     sc = new Scanner(System.in);//產生一個新物件, 掃描鍵盤輸入
     String str;
     System.out.println("Input String Data: ");
     str = sc.next();//sc.next()搜尋並傳回來自此掃瞄器的下一個完整旗標。目標為字串
     System.out.println("Hello "+str);
    }

}

輸出結果為

Input String Data: 
0    <------- 此為使用者的輸入值
Hello 0


Lab: 輸入字串

將程式碼改為

import java.lang.*;
import java.util.*;
public class MyInput {

    public static void main(String[] args) {
     
     Scanner sc;
     sc = new Scanner(System.in);//產生一個新物件, 掃描鍵盤輸入
     //String str;
     int istr;
     System.out.println("Input int Data: ");
     istr = sc.nextInt();//sc.nextInt()將輸入資訊的下一個旗標掃瞄為一個 int。目標為int
     System.out.println("Hello "+istr);
    }

}

輸出結果為

Input int Data: 
3  <---此為使用者輸入資料
Hello 3

但是萬一使用者輸入非 int 型態的資料, 就會產生
Input int Data: 
h <----此為使用者輸入資料  
Exception in thread "main" java.util.InputMismatchException
        at java.util.Scanner.throwFor(Scanner.java:857)
        at java.util.Scanner.next(Scanner.java:1478)
        at java.util.Scanner.nextInt(Scanner.java:2108)
        at java.util.Scanner.nextInt(Scanner.java:2067)
        at MyInput.main(MyInput.java:12)
Java Result: 1



Lab: ? :
建立一個程式碼

import java.lang.*;
import java.util.*;
public class MyOp {

    public static void main(String[] args) {
    int x = 3;
    int y = 2;
    String str;
    str = (x>y)?"x>y":"x<y";//如果為真執行?號後面的x>y, 如果為假就執行:號 x<y
    System.out.println("str = "+str);
    }

}

輸出結果為

str = x<y

Lab: 寫一個程式判斷奇數還是偶數

建立程式碼

import java.lang.*;
import java.util.*;
public class InputNumber {

    public static void main(String[] args) {
    Scanner sc =new Scanner(System.in);
    System.out.println("請輸入整數");
    int i = sc.nextInt();
    int x = i%2; // x等於輸入的整數 除以2 的餘數
    String str = (x == 0)?"偶數":"奇數"; // 餘數為0 就是偶數
    System.out.println(str);
    }

}









解決 openSUSE Linux 使用者名稱 以數字為開頭的問題

在RHEL 3 的時代,
使用者的名稱 ~ 就可以使用以數字為開頭來命名.
雖然這個不是一個好的方式,
系統有可能把 純數字的帳號與 UID 搞錯.
故 useradd 指令
一般來說是不允許以 數字為起始字元 來命名
例如
09C130 這樣的帳號就不被允許.

但是有些公司的使用者帳號就是以數字為開頭
然後 Windows Server 對這些帳號也不會有影響

但是在 openSUSE and SLES 還是對這樣的帳號會有限制的 ^^|||

當然, 有些朋友會使用手動修改........
但是如果常常要建立這樣的帳號該如何呢?

解決的方式為

修改  /etc/login.defs 內的設定
( 將 CHARACTER_CLASS 的第一個字元加入 0-9)


#
# User/group names must match the following regex expression.
# The default is [A-Za-z_][A-Za-z0-9_.-]*[A-Za-z0-9_.$-]\?,
# but be aware that the result could depend on the locale settings.
#
#CHARACTER_CLASS                [A-Za-z_][A-Za-z0-9_.-]*[A-Za-z0-9_.$-]\?
#原本的設定

#CHARACTER_CLASS         [ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_][ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.-]*[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.$-]\?


#改為以下 ( 加入 0123456789 )
CHARACTER_CLASS         [ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_][ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.-]*[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.$-]\?


這樣以後 useradd  要加入以數字為開頭的帳號
就不會被拒絕了 ^^

一定要記起來

星期三, 4月 21, 2010

2010-04-21_Java_SL100-3

2010-04-21_Java_SL100-3

Notes:
  • Net Beans 程式會將 class 的程式放在 專案名稱/src 資料夾底下
  • 除了 java.lan 以外的套件都要 import
  • Java 程式起點 ( Entry point ) 是從main 方法( Method ) 開始
  • 類別裡面有方法, 方法的裡面有程式.
  • System.out.println("Hello! World!")
    • 使用System 類別的out 成員( Member ), 要求使用out上的 println()方法,在螢幕顯示 Hello! World!
  • 建議一個檔案放一個類別.(比較不會混亂)
  • 使用 javac  -verbose 顯示詳細資訊
  • javac -encoding utf8 ( java 預設使用 ANSI編碼, 如果是使用 unicode編碼 要指定 -encoding)
  • /** 為文件註解 ( 可以使用 javadoc  *.java 產生 java 文件)

常見的錯誤訊息
  • cannot find symbol ( 找不到這個類別, 一般來說是沒有 import )
  • package system does not exit ( package 資料夾不存在 )
  • HelloWorld.java:4:';' expected ( 程式第 4列 忘記加 ; )
  • illegal character: \12288 ( 可能是編碼問題, 例如使用 unicode 編碼)

資料型態
整數:    byte        short        int         long
                1byte     2byte     4byte    8byte
小數:    float    double
                4        8
字元:    char
真假值:    boolean

每一個資料型態對應到一個類別, 可以使用MAX_VALUE 以及 MIN_VALUE來查看大小值
例如:
        int x=Integer.MAX_VALUE;
       System.out.println("Integer Max = "+x);
       int y=Integer.MIN_VALUE;
       System.out.println("Integer Min = "+y);


Lab: 運算練習
在NetBeans 內新增一個 Main Class 取名為 Airth1
程式內容如下

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author max
 */
public class Arith1 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        int a,b,c;
        a = 1;
        b = 3;

        c = a+b;
        System.out.println("c = "+c);

        c = a-b;
        System.out.println("c = "+c);

        c = a*b;
        System.out.println("c = "+c);

        c = a/b;
        System.out.println("c = "+c);//預設為整數,所以會顯示為0 (結果為0.333-)
        // TODO code application logic here
    }

}


Lab: a++ and ++a

自己整理一下, 程式碼如下

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author max
 */
public class Arith1 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        int a,b,c;
        a = 1;
        System.out.println("a ="+a);
        b = 2;
        a++;
        System.out.println("a = "+a);

        System.out.println("---------First Lab-----------------------------");
        System.out.println("a = "+a);
        c=a++;//會先執行 c=a; 然後才是a=a+1;
        System.out.println("Run c=a++; 會先執行 c=a; 然後才是a=a+1");
        System.out.println("a = "+a);
        System.out.println("c = "+c);

        System.out.println("---------Second Lab----------------------------");
        System.out.println("a = "+a);
        System.out.println("c = "+c);
        c=++a;//會執行 a=a+1; 然後才是c=a;
        System.out.println("Run c=++a; 會執行 a=a+1; 然後才是c=a");
        System.out.println("a = "+a);
        System.out.println("c = "+c);

        
        // TODO code application logic here
    }

}

輸出結果如下

a =1
a = 2
---------First Lab-----------------------------
a = 2
Run c=a++; 會先執行 c=a; 然後才是a=a+1
a = 3
c = 2
---------Second Lab----------------------------
a = 3
c = 2
Run c=++a; 會執行 a=a+1; 然後才是c=a
a = 4
c = 4


Lab: 轉型

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author max
 */
public class Arith1 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        int x,y;
        double z;

        x=121;
        y=7;
        z=x/y;
        System.out.println("還未轉型前 z 不能顯示小數, 因為 x, y 為整數");
        System.out.println("z = "+z);
        z=(double)x/y;
        System.out.println("轉型後 z 可以顯示小數");
        System.out.println("z = "+z);

        
        // TODO code application logic here
    }

}

輸出結果參考

還未轉型前 z 不能顯示小數, 因為 x, y 為整數
z = 17.0
轉型後 z 可以顯示小數
z = 17.285714285714285









星期一, 4月 19, 2010

2010-04-19_Java_SL100-2

2010-04-19_Java_SL100-2

classpath
  • 類別檔所在的資料夾位置
  • 要求編譯好的類別檔必須放在這個資料夾, 可以設定多個資料夾

Notes:
  • 攥寫Java 程式的第一步都是定義類別
  • 關鍵字都是小寫
  • 套件儘量用小寫
  • 類別如果沒有設定公開 ( public ), 那就只有該套件( package )可以使用, 別的套件不能使用

Package 就是資料夾

舉例來說, 如果原來的程式內容為

public class HelloWorld {
    public static void main(String args[]) {
        System.out.println("Hello Java !");
    }
}

這個時候編譯以及執行是ok的
但是如果修改程式的內容,  加入package 設定

package a; // 加入  package
public class HelloWorld {
    public static void main(String args[]) {
        System.out.println("Hello Java !");
    }
}

這個時候來編譯及執行會有問題

> javac HelloWorld.java 
> java HelloWorld
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld (wrong name: a/HelloWorld)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:632)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:319)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:264)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:332)
Could not find the main class: HelloWorld. Program will exit.

因為有定義 package, 所以這個程式應該是要在 a 資料夾底下
 
所以作法為
>mkdir   a                                            [建立 a 資料夾]
>mv   HelloWorld.class    a                [將 HelloWorld.class 移動到 a 資料夾下]
>java   a.HelloWorld                            [執行的時候 指定  a.HelloWorld 或是 a/HelloWorld ]

這樣才能成功的被執行

但是這樣很麻煩
所以一樣的情形, 也可以在編譯的時候 使用 -d 來指定目的地資料夾
man  javac 得到的資訊如下

-d directory
                Set the destination directory for class files. The destination
                directory must already exist; javac will not create the desti-
                nation  directory. If a class is part of a package, javac puts
                the class file in a subdirectory reflecting the package  name,
                creating directories as needed. For example, if you specify -d
                /home/myclasses and the class is called com.mypackage.MyClass,
                then  the  class  file  is  called /home/myclasses/com/mypack-
                age/MyClass.class.

所以簡單的方式為
>javac   -d  .   HelloWorld.java      ( -d 為目的地資料夾 )

編譯完之後檢查一下
> ls
a  HelloWorld.java
> ls  a
HelloWorld.class

執行方式為
> java a/HelloWorld
Hello Java !
> java a.HelloWorld
Hello Java !

Notes:
  • 在不同套件下要使用要 import 對方的套件還有類別
  • 要有 public static void main 才能被執行

Lab: 認識 public

>vi  ClassA.java

package a;
public class ClassA
    {
        public int a=7;
    }

>vi  ClassB.java

package b;
import a.ClassA;//匯入ClassA

public class ClassB
    {
    public static void main(String[] args)
        {
            ClassA obj; 
            obj = new ClassA();//產生物件參考
            System.out.println("變數 a ="+obj.a);
        }
    }

編譯 ClassA 以及 ClassB

> javac  -d  .   ClassA.java 
> javac  -d  .   ClassB.java 

執行 ClassB

> java   b.ClassB
變數 a =7

如果將 ClassA.java 內的public  拿掉就會發現 ClassB就會產生錯誤













星期五, 4月 16, 2010

2010-4-16_Java_SL-100-1

2010-4-16 Java SL-100


張庭禎 老師


使用軟體

  • Net Beans 6.8

  • JDK 6 update 18


我是使用 openSUSE 11.2 with Net Beans 6.8 來練習, 利用 one-click install 來安裝


網址如下


http://software.opensuse.org/ymp/Java:packages/openSUSE_11.2/netbeans.ymp



JDK  套件使用 openjdk ( 利用 YaST 安裝即可 )


java-1_6_0-openjdk-1.6.0.0_b16-5.10.1.i586



建議中文書
博碩文化出版社 作者: 高橋麻奈
Java2 程式設計實例入門 ISBN: 9575278844


Java 程式執行架構


.java
.class
API
JVM
OS


Notes:
  • Java 程式內的API 副檔名都是 .class
  • Java  內的所有檔案或是類別名稱不能以數字開頭
  • 區分文字大小寫
  • System.in 就是鍵盤
  • System.out 就是螢幕
  • System.out.println 在螢幕列出一行 ln = Line
  • 一般類別檔有個不成文的規定就是第一個字會大寫


Lab: 第一個java 小程式
建立一個 HelloWorld.java 檔案
內容如下


public class HelloWorld
{
    public static void main(String[] args)
    {
        System.out.println("Hello World");
    }
}


使用
javac  HelloWorld.java 編譯
java    HelloWorld         執行


啟動 NetBeans IDE 6.8

Notes:
  • 先產生專案,再加入程式

Lab: 建立一個新的專案

File --> New Project 
--> 選取Categories: Java Projects: Java Application  --> Next 
--> 修改 Project Name: JavaApp1 
--> 修改及勾選 Create Main Class 名稱為 HelloWorld
--> Finish

在 // TODO code application logic here 的區段輸入程式碼
// 為註解, 故不能輸入在後面
System.out.println("Hello World");
程式碼如下

public class HelloWorld {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
       System.out.println("Hello World"); // TODO code application logic here
    }

}


Notes:
  • 使用 F9 按鈕來執行編譯
  • 編譯好的類別檔 .class 會在預設位置資料夾內的 專案名稱/Build/classes 資料夾
  • java 使用 new 來配置記憶體,  使用null 來清空(切斷連結), 這塊記憶體就會變成Garbage
  • java 利用類別載入器來檢查程式是否合法
  • 要寫多執行緒要對作業系統內的 "多工" 原理有相當的了解.

在openSUSE Gnome 環境觀看 .chm 檔案

如果要在 Linux  的環境底下觀看 .chm  檔案

在 KDE 環境底下可以使用 kchmviewer

http://software.opensuse.org/search?p=1&baseproject=ALL&q=kchmviewer


在 gnome 環境底下可以使用 chmsee 來觀看

http://software.opensuse.org/search?p=1&baseproject=ALL&q=chmsee

也可以使用 Firefox 的附加元件來觀看 CHM Reader

https://addons.mozilla.org/zh-TW/firefox/addon/3235

但是實際來使用 Firefox 附加元件測試的時候
發現沒有辦法正常的打開 .chm 的檔案 ( 不知道是不是 Linux 或是中文的關係 )

但是使用 chmsee  在 Gnome 的環境是可以執行的
只是 index 的中文會變成亂碼  ( 內容是不影響啦 ~~ )

當然, 在Gnome 的環境 執行 kchmviewer ~~ 他有的時候就是 Crash 給你看

所以目前就先用 chmsee 來看  .chm 的文件
改天再來試試看有沒有更好的方案

^__^

星期四, 4月 15, 2010

轉換檔案編碼的好工具 convmv

最近因為移轉系統從 Fedora 4 到 openSUSE 11.2
系統的編碼方式也從原來的 Big5 到 UTF-8

所以在新的作業系統下來看之前的檔案與目錄名稱都是亂碼
搜尋了一下 google 發現了一個好的工具 convmv

參考來源如下
http://plog.longwin.com.tw/news-unix/2008/07/15/convmv_utf8_big5_convert_linux_2008

以下轉載自 Tsung's Blog
指令為
convmv  -f  big5  -t  utf-8 -r   --notest   *
  • -f big5 : 從 Big5 編碼轉換 (不過標準應該是要寫 big5-eten, 但是我測試 big5 也可以動. :P)
  • -t  utf-8 : 轉換編碼到 UTF-8
  • -r: 遞迴的將目錄下的所有檔名都做轉換
  • --notest : 如果不下這個, 一切動作都只是測試, 會直接將轉換前和轉換後的檔名列給你看, 這加下去, 才會實際轉換檔名.
  • * : 所有檔案
 真是太棒了

馬上記下來 ^^

星期三, 4月 14, 2010

From fedora to openSUSE 移轉小記

From fedora to openSUSE 移轉小記

因為目前已經習慣使用 openSUSE來當成作業系統
所以就將舊的 Server 從 Fedora 7 移轉到 openSUSE
以下是一些移轉小記

1. 預設密碼加密問題
fedora 預設使用 MD5 加密
openSUSE 預設使用 blowfish 加密

所以感覺上在進行主機移轉的時候要注意加密的問題!!
初步想法:
1.覺得要先將新的openSUSE主機的加密方式改變為MD5
2.匯入 fedora 的 shadow 檔案 到openSUSE進行移轉
3.將加密方式變更回 blowfish

實做移轉

結果將 /etc/shadow /etc/passwd /etc/group
( 去除掉原來的系統帳號, 附加到新的檔案後面 )
發現根本就沒有這個問題

因為 /etc/shadow 有包含 slat 機制
crypt 這個函式庫在加密的時候
會使用 slat 加入一個隨機數 與原來的明碼來進行加密

所以觀察 /etc/shadow 內容如下


max:$2a$05$.TwZgu4Bac1gHXTdslmDKevkKtLI/0ZodfvDUNrC5KTPMDdMSMuFy:14672:0:99999:7:::


johnson:$1$RVYz8gCF$NrJMtmGkN1FAFnFODEXH0.:14712:0:99999:7:::


其中 $1$ 代表 crypt 使用 salt 加密的方式
以下是在 crypt 指令內 salt 的語法
 
       $id$salt$encrypted

       then instead of using the DES machine,  id  identifies  the  encryption
       method  used  and  this  then  determines  how the rest of the password
       string is interpreted.  The following values of id are supported:

              ID  | Method
              ---------------------------------------------------------
              1   | MD5
              2a  | Blowfish (not in mainline glibc; added in some
                  | Linux distributions)
              5   | SHA-256 (since glibc 2.7)
              6   | SHA-512 (since glibc 2.7)

所以 當 slat 的 ID 為 1的時候 
如同上面的 johnson 代表是使用 MD5 加密的方式( fedora default)
後面的 藍色字串就是 slat
系統會將 密碼  + slat  加密的結果寫在後面

相對的
所以 當 slat 的 ID 為 2a的時候 
如同上面的 max 代表是使用 Blowfish 加密的方式( openSUSE default)
後面的 藍色字串就是 slat
系統會將 密碼  + slat  加密的結果寫在後面

這樣的好處就是在移轉的時候 直接將 /etc/shadow 作處理就好
( 去除掉原來的系統帳號, 附加到新的檔案後面 )


2. Samba 密碼問題
新舊版本的 samba 在於 passdb backend (密碼預設方式)
舊版本使用 smbpasswd
新版本使用 tdbsam

但是看了一下 samba 官方網站上面的資料


tdbsam

This backend provides a rich database backend for local servers. This backend is not suitable for multiple domain controllers (i.e., PDC + one or more BDC) installations.
The tdbsam password backend stores the old smbpasswd information plus the extended MS Windows NT/200x SAM information into a binary format TDB (trivial database) file. The inclusion of the extended information makes it possible for Samba-3 to implement the same account and system access controls that are possible with MS Windows NT4/200x-based systems.
The inclusion of the tdbsam capability is a direct response to user requests to allow simple site operation without the overhead of the complexities of running OpenLDAP. It is recommended to use this only for sites that have fewer than 250 users. For larger sites or implementations, the use of OpenLDAP or of Active Directory integration is strongly recommended.



tdbsam 不適合多個 DC 還有建議在 250 以下的使用者
如果超過 250 以上, 那就建議使用 ldapsam 來代替

所以這樣的想法就會讓我想要使用 原本的 smbpasswd 就好
如果使用者規模超過一定 就使用 ldapsam
因為實務上也沒有輸入太多的使用者資訊

這邊有個搜尋到的 blog 到是可以參考一下

想法上直接將舊的 smbpasswd and smb.conf 覆蓋過來就可以
^__^


先這樣~~




星期四, 4月 08, 2010

在openSUSE Gnome 環境輸入西班牙文

在Windows  的環境可以藉由
新增 西文的輸入法來新增西班牙文

在Linux 的SCIM 輸入法內, 並沒有看到西班牙文的輸入法

Google 了一下解決方案, 找到解決方式如下

在 Gnome Panel 按滑鼠右鍵  --> 加入面板
--> 然後將  "鍵盤配置指示器" 加入到面板

於鍵盤配置指示器 上方按滑鼠右鍵 --> 點選 鍵盤偏好設定
--> 點選 配置標籤 --> 點選 加入
--> 國家的部份選取西班牙 --> 點選 加入
--> 關閉 鍵盤配置指示器視窗

這樣 Gnome Panel 上面就有兩種鍵盤配置可以選取 USA 還有 西班牙

輸入方法如下

西文符號    原來美式鍵盤按鈕
!   -->   shift + 1 按鈕
¡   -->   = 按鈕
?  -->   Shift +  - 按鈕
¿  -->   Shift + = 按鈕
è  -->   [ + 英文字母按鈕

星期日, 4月 04, 2010

openSUSE News 套件安裝及使用

openSUSE  Weekly News 

SUSEnews 套件安裝及使用

SUSEnews 是 STS301 開發
用於將英文版的 openSUSE Weekly News 相關項目翻譯為當地語系

SUSEnews 可以藉由 one click install 來安裝. 

可以在 http://software.opensuse.org/search 中搜尋 susenews

搜尋結果可以參考以下網址

可以利用  one click install 安裝, 或是使用
/sbin/OneClickInstallUI 指令來安裝
( 要執行  OneClickInstallUI 必須安裝 yast2-metapackage-handler 套件 )

以 openSUSE 11.2 為例

以 root 身份 執行以下指令
# OneClickInstallUI   http://software.opensuse.org/ymp/home:STS301/openSUSE_11.2/SUSEnews.ymp

出現安裝畫面如下 點選 Next 


確認安裝套件為 SUSEnews 點選 Next



確認相關資訊 點選
Next



出現警告視窗, 請點選
Yes 確認



出現 匯入金鑰畫面(Import Untrusted GnuPG Key) 請點選
Import 匯入



安裝完成, 請點選
Finish



****** 使用 SUSEnews 套件 來進行翻譯準備 ******
安裝完成後可以藉由兩個方式執行 SUSEnews

1.以指令的方式 可以以一般使用者的方式執行
> /usr/bin/SUSEnews

2.在Gnome 傳統選單 或是 應用程式內的
程式開發類別內的 SUSEnews

啟動後畫面如下
主要有兩個部份
1. 於下拉式選單 點選或是輸入 openSUSE Weekly News 期數, 這邊以 117 期為例
2. 勾選 Light Version ( 如果要翻譯的是 Light Version), 不勾選則是使用  Full Version



接下來點選 Settings 標籤
主要有 3 個部份
1.Output folder 的部份,可以瀏覽或是輸入 要產出的資料夾位置, 這邊以/home/max/桌面 為例
2.選取語系( Language ) 這邊以TW 為例
3.勾選 create for each issue an own folder ( 這樣會針對每一期建立一個資料夾)



點選 Newsletter 標籤, 點選  Work 按鈕進行輸出




接下來在指定的輸出目錄就會有產出的檔案, 畫面如下



接下來將檔案內容貼到 wiki就可以開始翻譯了

由於這個套件是利用當地所提供的  ini檔來作轉換, 所以當 openSUSE Weekly News 的樣板有換
針對 該英文 補上 中文翻譯 ( 使用 1a 1b , a為英文 b為中文 )

希望這份文件對翻譯團隊有幫助

sakana  2010/4/4 筆




星期六, 4月 03, 2010

利用 wine 來執行 kindle for PC

一直覺得 電子書 是未來的趨勢
利用 kindle 來閱讀也是一件方便的事情
但是Amazon目前還沒有針對 Linux 釋出或是開發介面
所以就使用 wine 結合 windows 版本的kindle for PC 來閱讀
但是就現在的kindle for PC 版本 ( 2010/4/3 6MB) 使用 wine來執行是有問題的
搜尋一下 google 發現要使用早期的版本 (大小為 5.2 MB) 來結合 wine執行
去google 搜尋了一下, 果然找到 5.2MB大小的版本
利用wine 執行安裝, 一開始一樣會要求輸入帳號/密碼
雖然看不見自己輸入的文字, 但是一樣可以跟Amazon註冊機器

接下來就是 執行 #winecfg
針對 KindleForPC.exe 設定windows 版本為 windows 98即可

另外, 針對wine 的字型太小以及不好看, 可以使用

  • #winecfg 桌面整合標籤內的物件, 將有關於文字的字型設定都設定大一點
  • 將/usr/share/fonts/truetype/ 內的字型,複製到 ~/.wine/drive_c/windows/Fonts
就可以改善

enjoy it

分享