2013年12月25日 星期三

增加sudo權限給使用者

情境

指定帳號給他執行sudo的權限

需求

1. root帳號

2. visudo

步驟

1. 利用root登入 或是 其他有權限的使用者

2. 輸入 visudo,會自動開啟vi,在裡面找到 

        root    ALL=(ALL)    ALL

3. 在這個區塊輸入指定的username,並設定權限如下

        username    ALL=(ALL)    ALL

4. :wq! 存檔, 指定的user已經可以使用sudo囉!

2013年11月7日 星期四

Thread Test!!



import java.util.LinkedList;
import java.util.List;


public class Can {
public static int count = 0;
public LinkedList<String> can = new LinkedList<String>();

public Can(){
count++ ;
System.out.println(count);
}
public void addObj(String obj){
can.addLast(obj);
}
public void removeObj(){
can.removeLast();
}
@Override
public String toString() {
return can.toString();
}
}

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

class Person implements Runnable{
public String name;
public Can can;
public Person(Can can, String name){
this.can = can ;
this.name = name ;
}
public void action(){
int SIZE = 100;
if(can.can.size() == SIZE){
for(int i = 0 ; i < SIZE; i++){
can.removeObj();
System.out.println(name +" take");
}
}else{
for(int i = 0 ; i < SIZE; i++){
can.addObj(name);
System.out.println(name +" drop");
}
}
}
@Override
public void run() {

//
synchronized(this){ // 鎖在自己身上。沒用!!
synchronized(can){  // 鎖在同樣的instance上。work!!
action();
}
}
}
public class Main {
public static Can c = new Can();
public static Can getACan(){
return c;  // 模擬Container, singleton
// return new Can();// 模擬Container, non-singleton
}
public static void main(String[] args) {
Can can = getACan();
Thread p1Action = new Thread(new Person(getACan(), "A"));
p1Action.start();

Thread p2Action = new Thread(new Person(getACan(), "B"));
p2Action.start();
}

}

2013年10月27日 星期日

Log4j概念 與使用情境

那天在跟公司新人介紹log4j的時候

就突然想到其實這個設計很簡單啊 怎麼會一直都沒有被弄清楚?

所以 來吧!! 介紹一下!!

在log4j的官方文件上面有一段清楚地說明

http://logging.apache.org/log4j/1.2/manual.html

Log4j has three main components: loggersappenders and layouts. These three types of components work together to enable developers to log messages according to message type and level, and to control at runtime how these messages are formatted and where they are reported.
Logger用來記錄訊息,包含log等級與log類型

Appender用來控制訊息會被放到什麼地方

Layout用來控制訊息的格式



簡單的情境如下

我們設定一個appender與layout

指定log會被記錄到檔案中 (appender)

並且會使用 "yyyy/mm/dd hh:MM:ss [訊息等級] 訊息內容" 格式來記錄訊息

接著設定 logger

指定一個logger要log的等級是INFO以上

並且將logger與appender接上


之後在程式裡面就取得此logger,並且使用應該使用的log等級來記錄訊息

例如
logger.trace("測試測試");
logger.debug("變數A = " + A);
logger.error("db conn. setting error.");


因為設定已經將log的等級設定為INFO

所以依照 TRACE < DEBUG < INFO < WARN < ERROR < FATAL 的等級

之前的訊息只有 error的項目 會被記錄到最後產生出來的檔案中

2013年9月13日 星期五

Maven專案設定

通常我們在開發的時候,會把專案切成幾個部分

例如前端呈現與後台邏輯,各自也可以有自己架構

前端呈現或許可以是單純html+javascript library

也可以用類似ZK這樣比較大型的framework

這時候我們一樣可以使用Maven來幫助我們做管理


首先 建立一個主專案 裡面的pom.xml設定
<project>
.
.
.
   <packaging>pom</packaging>
.
.
.
   <modules>
      <module>webProject</module>
      <module>serviceProject</module>   </modules>
.
.
.
</project>

有看到module嗎?我們可以直接在主專案資料夾裡面建立其他的maven專案

這樣當我們編譯主專案的時候,就會跟著依照module的名稱,去編譯其他的module囉

2013年7月30日 星期二

Jasypt - BasicTextEncryptor

http://jasypt.org/api/jasypt/1.9.0/org/jasypt/util/text/BasicTextEncryptor.html

Sample:

import org.jasypt.util.text.BasicTextEncryptor;

public class EncryptTest {
    public static void main(String[] args) {
        BasicTextEncryptor bte = new BasicTextEncryptor();
        bte.setPassword("password");

        String text = "This is visible message!";
        String encrypt = bte.encrypt(text);
        System.out.println("invisible msg:"+encrypt);

        String rs = bte.decrypt(encrypt);
        System.out.println("Decode:" +rs);
    }

}

聽說寫網誌 還是要打一些字。

所以跟廢話注解一樣,這是在說明BasicTextEncryptor的用法。

(Y)

2013年6月28日 星期五

bootstrap compile

brew install nodejs
// 先有nodeJS才會有npm

npm install
// 到git下來的資料夾,裡面有個package.json設定有該裝的東西 npm可以安裝起來

make
// 先make安裝基本的library -> node_modules

make bootstrap
// 編譯,會輸出到bootstrap資料夾

--
npm 已經安裝了!!! (超怪...)

被安裝在 /usr/local/lib/node_modules/npm

導致不能安裝nodejs

homebrew指定的解安裝指令也不能用... 真的有點囧 (npm uninstall npm -g)

最後直接移除掉npm的資料夾

再安裝nodejs (成功)

--
路徑沒有被自動建立起來.... (囧)

brew link node (失敗)

brew link --overwrite node

2013年6月26日 星期三

mac install pure-ftpd

progden:~ $brew install pure-ftpd
dyld: DYLD_ environment variables being ignored because main executable (/usr/bin/sudo) is setuid or setgid
==> Downloading http://download.pureftpd.org/pub/pure-ftpd/releases/pure-ftpd-1.
######################################################################## 100.0%
==> ./configure --prefix=/usr/local/Cellar/pure-ftpd/1.0.35 --mandir=/usr/local/
==> make install
==> Caveats
To have launchd start pure-ftpd at login:
    ln -sfv /usr/local/opt/pure-ftpd/*.plist ~/Library/LaunchAgents
Then to load pure-ftpd now:
    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.pure-ftpd.plist
Or, if you don't want/need launchctl, you can just run:
    pure-ftpd
/usr/local/Cellar/pure-ftpd/1.0.35: 26 files, 608K, built in 29 seconds

2013年6月19日 星期三

Maven lifecycle phase整理

Maven command format

  mvn <lifycyclePhase>

  mvn <plugin-prefix>:<goal>

  mvn <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>


Available lifecycle phases

validate,
initialize,
generate-sources, process-sources, generate-resources, process-resources,
compile,
process-classes,
generate-test-sources, process-test-sources, generate-test-resources, process-test-resources,
test-compile,
process-test-classes,
test,
prepare-package, package,
pre-integration-test, integration-test, post-integration-test,
verify,
install,
deploy,
pre-clean, clean, post-clean,
pre-site, site, post-site, site-deploy


start httpd with right configuration

httpd_start.sh

#!/bin/sh
sudo httpd -k start -f ~/conf/httpd.conf


~/conf/httpd.conf

.
.
.
DocumentRoot "/specify/path/to/the/root"
.
.
.

2013年6月11日 星期二

Homebrew安裝Mysql

brew install mysql

cp /usr/local/Cellar/mysql/5.5.28/homebrew.mxcl.mysql.plist ~/Library/LaunchAgents/
launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist


unset TMPDIR
mysql_install_db --verbose --user=`whoami` --basedir="$(brew --prefix mysql)" --datadir=/usr/local/var/mysql --tmpdir=/tmp
/usr/local/Cellar/mysql/5.5.28/bin/mysqladmin -u root -h Denniss-MacBook-Pro.local password 'password'

mysql.server start
mysql -u root -p

2013年6月6日 星期四

Maven 清除下載失敗


Mac/Linux

find ~/.m2 -name "*.lastUpdated" -exec grep -q "Could not transfer" {} \; -print -exec rm {} \;


Windows

cd %userprofile%\.m2\repository
for /r %i in (*.lastUpdated) do del %i

Homebrew安裝多個版本程式 與 建立link

1. 檢視所有的版本
2. 依照版本安裝更新程式
3. 重新建立連結

brew update
brew versions FORMULA

#move to Homebrew's install path
cd `brew --prefix`
git checkout HASH Library/Formula/FORMULA.rb
brew unlink FORMULA(option)
brew install FORMULA

brew switch FORMULA VERSION
git checkout -- Library/Formula/FORMULA.rb(??)


Ex.
$brew update
$brew versions tomcat

7.0.32   git checkout 55cfbdf /usr/local/Library/Formula/tomcat.rb
7.0.30   git checkout ec5e2ca /usr/local/Library/Formula/tomcat.rb
7.0.29   git checkout 1683f9e /usr/local/Library/Formula/tomcat.rb
7.0.28   git checkout 3293f97 /usr/local/Library/Formula/tomcat.rb
7.0.27   git checkout 82498e5 /usr/local/Library/Formula/tomcat.rb
7.0.26   git checkout ee016a5 /usr/local/Library/Formula/tomcat.rb
7.0.25   git checkout 48c1c63 /usr/local/Library/Formula/tomcat.rb
7.0.23   git checkout 09e1800 /usr/local/Library/Formula/tomcat.rb
7.0.21   git checkout 22d9df7 /usr/local/Library/Formula/tomcat.rb
7.0.20   git checkout f857eca /usr/local/Library/Formula/tomcat.rb
7.0.19   git checkout 548514e /usr/local/Library/Formula/tomcat.rb
7.0.16   git checkout 14e4db3 /usr/local/Library/Formula/tomcat.rb
7.0.14   git checkout bdd4756 /usr/local/Library/Formula/tomcat.rb
7.0.6    git checkout 0476235 /usr/local/Library/Formula/tomcat.rb
6.0.26   git checkout 9e18876 /usr/local/Library/Formula/tomcat.rb

2.
cd `brew --prefix`

2013年3月8日 星期五

oracle DROP all objects


set heading off
set term off
set echo off
set feedback off
set pagesize 0
spool AllObjectsDrop.sql
SELECT 'DROP DATABASE LINK ' || OBJECT_NAME || ';' FROM USER_OBJECTS WHERE OBJECT_TYPE = 'DATABASE LINK';
SELECT 'DROP TYPE ' || OBJECT_NAME || ';' FROM USER_OBJECTS WHERE OBJECT_TYPE = 'TYPE';
SELECT 'DROP TRIGGER ' || OBJECT_NAME || ';' FROM USER_OBJECTS WHERE OBJECT_TYPE = 'TRIGGER';
select 'drop view '||view_name||';' from user_views;
select 'drop sequence '||sequence_name|| ';'from user_sequences;
select 'DROP MATERIALIZED VIEW ' || MVIEW_NAME || ';' FROM user_mviews;
select 'drop table '||table_name|| ';'from user_tables;
select 'drop procedure '||OBJECT_NAME|| ';'from USER_OBJECTS where OBJECT_TYPE = 'PROCEDURE';
select 'drop function '||OBJECT_NAME|| ';'from USER_OBJECTS where OBJECT_TYPE = 'FUNCTION';
select 'drop package '||OBJECT_NAME|| ';'from USER_OBJECTS where OBJECT_TYPE = 'package';
select 'drop synonym '||OBJECT_NAME||';' from USER_OBJECTS where OBJECT_TYPE = 'SYNONYM';
spool off

2013年2月27日 星期三

VitualBox調整磁碟空間

VBoxManage是VitualBox的指令工具 利用modifyhd指令跟resize參數就可以調整虛擬磁區的大小

路徑可以有空白不過需要用雙引號括起來 resize參數的單位是MB


  VBoxManage modifyhd "/path/to/dvi/file" --resize 50000

2013年2月24日 星期日

2013年2月23日 星期六

Oracle 清除所有Objects


begin
  -- Drop Tables
  FOR REC IN (
      SELECT table_name 
      FROM user_tables 
      WHERE NOT EXISTS(SELECT 1 FROM USER_VIEWS WHERE VIEW_NAME = TABLE_NAME)
        and NOT EXISTS(SELECT 1 FROM USER_MVIEWS WHERE MVIEW_NAME = TABLE_NAME)
    )
  LOOP
    BEGIN 
      EXECUTE IMMEDIATE 'DROP TABLE ' || REC.table_name;
    EXCEPTION
      WHEN OTHERS THEN
        IF SQLCODE != -942 THEN
           RAISE;
        END IF;
  END;
  END LOOP;
  
  -- VIEW
  FOR REC IN (
      SELECT VIEW_NAME 
      FROM user_views
    )
  LOOP
    BEGIN 
      EXECUTE IMMEDIATE 'DROP VIEW ' || REC.VIEW_NAME;
    EXCEPTION
      WHEN OTHERS THEN
        IF SQLCODE != -942 THEN
           RAISE;
        END IF;
  END;
  END LOOP;
  
  -- MVIEW
  FOR REC IN (
      SELECT mview_name FROM USER_MVIEWS
    )
  LOOP
    BEGIN 
      EXECUTE IMMEDIATE 'DROP MATERIALIZED VIEW ' || REC.mview_name;
    EXCEPTION
      WHEN OTHERS THEN
        IF SQLCODE != -942 THEN
           RAISE;
        END IF;
  END;
  END LOOP;
  
  -- FUNCTION
  FOR REC IN (
      SELECT object_name FROM user_objects WHERE object_type = 'FUNCTION'
    )
  LOOP
    BEGIN 
      EXECUTE IMMEDIATE 'DROP FUNCTION ' || REC.object_name;
    EXCEPTION
      WHEN OTHERS THEN
        IF SQLCODE != -942 THEN
           RAISE;
        END IF;
  END;
  END LOOP;
  
  -- PROCEDURE
  FOR REC IN (
      SELECT object_name FROM user_objects WHERE object_type = 'PROCEDURE'
    )
  LOOP
    BEGIN 
      EXECUTE IMMEDIATE 'DROP PROCEDURE ' || REC.object_name;
    EXCEPTION
      WHEN OTHERS THEN
        IF SQLCODE != -942 THEN
           RAISE;
        END IF;
  END;
  END LOOP;
  
  -- DATABASE LINK
  FOR REC IN (
      SELECT object_name FROM user_objects WHERE object_type = 'DATABASE LINK'
    )
  LOOP
    BEGIN 
      EXECUTE IMMEDIATE 'DROP DATABASE LINK ' || REC.object_name;
    EXCEPTION
      WHEN OTHERS THEN
        IF SQLCODE != -942 THEN
           RAISE;
        END IF;
  END;
  END LOOP;
  
  -- TYPE
  FOR REC IN (
      SELECT object_name FROM user_objects WHERE object_type = 'TYPE'
    )
  LOOP
    BEGIN 
      EXECUTE IMMEDIATE 'DROP TYPE ' || REC.object_name || ' FORCE';
    EXCEPTION
      WHEN OTHERS THEN
        IF SQLCODE != -942 THEN
           RAISE;
        END IF;
  END;
  END LOOP;
  
  -- JOB
  FOR REC IN (
      SELECT object_name FROM user_objects WHERE object_type = 'JOB'
    )
  LOOP
    dbms_scheduler.drop_job(REC.OBJECT_NAME);
  END LOOP;

-- Drop SYNONYM
  FOR REC IN (
      select OBJECT_NAME from user_objects where object_type = 'SYNONYM'
    )
  LOOP
    BEGIN 
      EXECUTE IMMEDIATE 'DROP SYNONYM ' || REC.OBJECT_NAME;

    EXCEPTION
      WHEN OTHERS THEN
        IF SQLCODE != -942 THEN
           RAISE;
        END IF;
  END;
  END LOOP;
end;

2013年2月14日 星期四

Layout - BoxLayout


BoxLayout

BoxLayout1, 水平與垂直Box, X_AXIS, Y_AXIS
BoxLayout2, 自動推開元件: Glue, HorizontalGlue, VerticalGlue
BoxLayout3, 固定大小的分隔: HorizontalStrut, VerticalStrut
BoxLayout4, 有長跟寬的分隔: RigidArea
BoxLayout5, 有最小最大跟預設大小的RigidArea: Box.Filler
BoxLayout6, Box中在裝Box: HorizontalBox, VerticalBox

   X_AXIS:从左到右水平布置组件。
   Y_AXIS:从上到下垂直布置组件。
   LINE_AXIS:根据容器的 ComponentOrientation 属性,按照文字在一行中的排列方式布置组件。如果容器的 ComponentOrientation 表示水平,则将组件水平放置,否则将它们垂直放置。对于水平方向,如果容器的 ComponentOrientation 表示从左到右,则组件从左到右放置,否则将它们从右到左放置。对于垂直方向,组件总是从上到下放置的。
   PAGE_AXIS:根据容器的 ComponentOrientation 属性,按照文本行在一页中的排列方式布置组件。如果容器的 ComponentOrientation 表示水平,则将组件垂直放置,否则将它们水平放置。对于水平方向,如果容器的 ComponentOrientation 表示从左到右,则组件从左到右放置,否则将它们从右到左放置。对于垂直方向,组件总是从上向下放置的。

BoxLayout1, 水平與垂直Box, X_AXIS, Y_AXIS


import java.awt.Container;
import java.awt.GridLayout;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class TestBoxLayout1 {
public static void main(String[] args) {
JFrame frame = new JFrame("BoxLayout-1");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container cp = frame.getContentPane();
cp.setLayout(new GridLayout(0, 1));

JPanel panel = null;
panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
panel.add(new JButton("1"));
panel.add(new JButton("2"));
panel.add(new JButton("3"));
cp.add(panel);

panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.add(new JButton("4"));
panel.add(new JButton("5"));
panel.add(new JButton("6"));
cp.add(panel);

frame.setVisible(true);
frame.pack();
}
}

BoxLayout2, 自動推開元件: Glue, HorizontalGlue, VerticalGlue

import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class TestBoxLayout2 {
public static void main(String[] args) {
JFrame frame = new JFrame("BoxLayout-2");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container cp = frame.getContentPane();
cp.setLayout(new GridLayout(0, 1));
JPanel panel = null;

// glue在垂列與水平的boxLayout中有作用
panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
panel.add(new JButton("1"));
panel.add(Box.createGlue());
panel.add(new JButton("2"));
panel.add(new JButton("3"));
cp.add(panel);

panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.add(new JButton("1"));
panel.add(Box.createGlue());
panel.add(new JButton("2"));
panel.add(new JButton("3"));
cp.add(panel);

// 水平的glue只在水平的BoxLayout中有作用
panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
panel.add(new JButton("1"));
panel.add(Box.createHorizontalGlue());
panel.add(new JButton("2"));
panel.add(new JButton("3"));
cp.add(panel);
// 水平的glue在垂列的box中沒有作用
panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.add(new JButton("1"));
panel.add(Box.createHorizontalGlue());
panel.add(new JButton("2"));
panel.add(new JButton("3"));
cp.add(panel);

frame.setVisible(true);
frame.pack();
}
}



BoxLayout3, 固定大小的分隔: HorizontalStrut, VerticalStrut

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class TestBoxLayout3 {
public static void main(String[] args) {
JFrame frame = new JFrame("BoxLayout-3");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container cp = frame.getContentPane();
cp.setLayout(new GridLayout(0, 1));
JPanel panel = null;

panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
panel.add(new JButton("1"));
panel.add(Box.createHorizontalGlue());
panel.add(new JButton("2"));
panel.add(new JButton("3"));
cp.add(panel);

// Strut可以固定分隔的大小
panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
panel.add(new JButton("1"));
panel.add(Box.createHorizontalStrut(50));
panel.add(new JButton("2"));
panel.add(new JButton("3"));
cp.add(panel);

frame.setVisible(true);
frame.pack();
}
}




BoxLayout4, 有長跟寬的分隔: RigidArea

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class TestBoxLayout4 {
public static void main(String[] args) {
JFrame frame = new JFrame("BoxLayout-4");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container cp = frame.getContentPane();
cp.setLayout(new GridLayout(0, 1));
JPanel panel = null;
// RigidArea就像是有寬跟高的strut
// 設置比較大的值 會讓排版的大小也變得更大
panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
panel.add(new JButton("1"));
panel.add(Box.createRigidArea(new Dimension(100, 50)));
panel.add(new JButton("2"));
panel.add(new JButton("3"));
cp.add(panel);
panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.add(new JButton("1"));
panel.add(Box.createRigidArea(new Dimension(100, 50)));
panel.add(new JButton("2"));
panel.add(new JButton("3"));
cp.add(panel);
frame.setVisible(true);
frame.pack();
}
}


BoxLayout5, 有最小最大跟預設大小的RigidArea: Box.Filler

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.Box;
import javax.swing.Box.Filler;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class TestBoxLayout5 {
public static void main(String[] args) {
JFrame frame = new JFrame("BoxLayout-5");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container cp = frame.getContentPane();
cp.setLayout(new GridLayout(0, 1));
JPanel panel = null;
//Filler 就像是可變動大小的Strut
panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
panel.add(new JButton("1"));
Dimension min = new Dimension(50, 50);
Dimension max = new Dimension(150,150);
Dimension preferred = new Dimension(100, 100);
Filler filler = new Box.Filler(min, preferred, max);
panel.add(filler);
panel.add(new JButton("2"));
panel.add(new JButton("3"));
cp.add(panel);
frame.setVisible(true);
frame.pack();
}
}



BoxLayout6, Box中在裝Box: HorizontalBox, VerticalBox

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;



public class TestBoxLayout6 {
public static void main(String[] args) {
JFrame frame = new JFrame("BoxLayout-6");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container cp = frame.getContentPane();
cp.setLayout(new GridLayout(0, 1));
JPanel panel = null;
// Box的功能 其實可以直接其他layout搭配Box來用!!!
panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
panel.add(new JButton("1"));
Box box = Box.createVerticalBox();
box.add(new JButton("4"));
box.add(new JButton("5"));
box.add(new JButton("6"));
panel.add(box);
panel.add(new JButton("2"));
box = Box.createVerticalBox();
box.add(new JButton("7"));
box.add(new JButton("8"));
box.add(new JButton("9"));
panel.add(box);
panel.add(new JButton("3"));
cp.add(panel);
frame.setVisible(true);
frame.pack();
}
}



Layout - BorderLayout, FlowLayout, GridLayout


BorderLayout


BorderLayout - Example

除了常見的東西南北中發白之外 再加上Hgap與VGap兩個屬性


import java.awt.BorderLayout;
import java.awt.Container;

import javax.swing.JButton;
import javax.swing.JFrame;


public class TestBorderLayout {
public static void main(String[] args) {
JFrame frame = new JFrame("BorderLayout");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container cp = frame.getContentPane();

BorderLayout layout = new BorderLayout();
layout.setHgap(100);
layout.setVgap(30);
cp.setLayout(layout);

JButton north = new JButton("North");
JButton south = new JButton("South");
JButton east = new JButton("East");
JButton west = new JButton("West");
JButton center = new JButton("Center");

cp.add(north, BorderLayout.NORTH);
cp.add(south, BorderLayout.SOUTH);
cp.add(east, BorderLayout.EAST);
cp.add(west, BorderLayout.WEST);
cp.add(center, BorderLayout.CENTER);

frame.setVisible(true);
frame.pack();
}

}





FlowLayout - Example

預設值除了Hgap與VGrap外多了一個Alignment


import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;


public class TestFlowLayout {
public static void main(String[] args) {
JFrame frame = new JFrame("FlowLayout");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container cp = frame.getContentPane();

FlowLayout layout = new FlowLayout(FlowLayout.CENTER, 10, 10); 
// DEFAULT is (CENTER, 5, 5)
cp.setLayout(layout);
JButton btn[] = new JButton[10];
for(int i = 0 ; i < btn.length; i++){
btn[i] = createBtn(i);
cp.add(btn[i]);
}
frame.setVisible(true);
frame.pack();
}

private static JButton createBtn(int i) {
JButton btn = new JButton();
Color bg = new Color(i*256/10,i*256/10,i*256/10);
btn.setText(""+(i*256/10));
btn.setForeground(bg);
return btn;
}
}

靠左,中,右對齊


GridLayout 

不得不說的事情是當我們放元件進去的時候是無法指定他放在grid的什麼位置的
因為這個layout的排版方式就是將parent裡面的所有元件拿來依照指定的gird size來排位置


import java.awt.Container;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;


public class TestGridLayout {
public static void main(String[] args) {
JFrame frame = new JFrame("FlowLayout");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container cp = frame.getContentPane();

// DEFAULT is (1, 0, 0, 0);
GridLayout layout = new GridLayout(5, 5, 10, 10);
cp.setLayout(layout);
for(int i = 0 ; i < 25 ; i++){
if(i%2 == 0){
cp.add(new JButton(""+i));
}else{
cp.add(new JLabel());
}
}
frame.setVisible(true);
frame.pack();
}

}


2013年1月24日 星期四

MySQL指令 紀錄

mysqladmin -u root password 'password'

mysqladmin -u root -p password 'newPassord'

mysql -u root -p

2013年1月6日 星期日

~/.profile 沒有作用

昨天發現寫在.profile的一些export沒有作用,後來發現原來是安裝SyncGood之後它自動幫我建了一個~/.bash_profile所以導致我的~/.profile沒作用!!

查了一下執行/etc/profile, ~/.bash_profile, ~/.bash_login, ~/.profile, ~/.bashrc等 的執行順序

1. /etc/profile

以下三個會先遇到先執行 之後的就跳過

2.1. ~/.bash_profile
2.2. ~/.bash_login
2.3. ~/.profile

登出的時候會執行

~/.bash_logout


2013年1月3日 星期四

httpd apache2

Apache目錄: /etc/apache2


確定 userdir_module 沒有被注解
    LoadModule userdir_module libexec/apache2/mod_userdir.so


把 /etc/apache2/users/Guest.conf 複製一份成 /etc/apache2/users/userName.conf
將內容修改為


<Directory "/Users/userName/Sites/">
    Options Indexes MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>


指令 httpd -k [start|stop|restart]
開啟 httpd


瀏覽器 http://localhost/~userName