顯示具有 程式語言 標籤的文章。 顯示所有文章
顯示具有 程式語言 標籤的文章。 顯示所有文章

利用 python update 資料庫欄位,跳脫字元的方式 (escape string)

在 python 中,用 Mysqldb module 結果在 stackoverflow 一個討論串中有個很讚的做法:

What is the best escape character strategy for Python/MySQL combo?
  • row[1] 指的是 column name
  • row[3] 指的是要 insert 的 data
  • row[0] 指的是 where 條件式域比對的限制條件

比對一下原始的 sql 就很清楚了:
cursor2.execute("update myTable set `"+ str(row[1]) +"` = \"'" + str(row[3]) +"'\" where ID = '"+str(row[0])+"'")

低耦合(Low-Coupling)與高內聚力(High Cohesion)的設計原則

物件導向設計有一個很重要的原則就是盡量達到低耦合(Low-Coupling)與高內聚力(High-Cohesion)的結果。最近看到一篇文叫作【Two powerful principles to improve the design】的文章用很簡潔的方式介紹了這樣設計的好處。

J2EE Solutions 比較表

這個網站收錄了J2EE Open Source各種solutions的比較表,從Presentation、IDE、Web ... 等分門別類整理,還不錯,可以當作一個參考。



http://swik.net/CompareJ2EESolutions

Spring Social 介紹

Spring Social 是最近Spring Project中所提供的一個Framework,它讓使用者可以把你原有的Spring Application和Thrid-Party Service Provide(ex : facebook, twitter)做整合,讓你用這些SaaS來認證,操作其API...等等。

Maven 之 POM(Project Object Model) 設定檔

在Maven中,最重要也是最基本的就是POM(Project Object Model)了。POM是一個XML的設定檔,它包含了Maven在建置專案時的所有資訊。

在執行Maven時,它會去檢查專案目錄下是某具有pom.xml檔案,如果沒有時,任何操作都會出現build error。

解決jdom輸出時產生無意義(空白)Namespace之問題

在新版的jdom(我用的時候是1.1)中,使用XMLOutputter來輸出整個XML Document時,在Element上會產生空白內容的Namespace,像是這樣:

<bean xmlns=""></bean>
不管是呼叫Element的removeNamespaceDeclaration()或是設定NO_NAMESPACE都沒有用,甚至在create element之後呼叫remove attribute()去remove xmlns屬性也不行,這案情不單純阿...。

後來Google到一篇,裡面說到jdom新版有bug,要去source code裡面解決,不過也沒說是什麼問題,只好自己來啦!好險並不是很困難,原因在於XMLOutputter這支code裡面出了問題,在XMLOutputter中,有一個方法叫printNamespace,裡面原本的code有一段是長這樣:



很明顯有了錯,改成下面這樣就可以了:

[Shell Script] 用echo將文字以附加(apppend)方式寫入檔案

在編寫Shell Script時,如果你有echo到某個檔案的需求,你希望寫入檔案時是以附加(append)的方式進行,而不是整個覆蓋的話,你可以使用【>>】來取代【>】:

echo "aaa" >> /home/kevingo/example.txt
echo "bbb" >> /home/kevingo/example.txt


如此一來,example.txt中的內容就會是:
aaa
bbb

[Android Dev] 判斷SD卡是否存在

To check whether the sdcard existed or not, execute the following code :

if(android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))

JOSSO 解決登入出現AuthenticationFailureException的問題

最近在研究JOSSO(Java Open Single Sign-On)時,在登入時會出現AuthenticationFailureException,找了一段時間的資料,發現在這個討論串有類似的解答:


主要是說,當你在josso-gateway-auth.xml中設置的basic-authscheme如果是basic-auth-scheme時,要把hashAlgorithm和hashEncoding這兩個properties拿掉,不然會出現類似的Exception。

拿掉之後的配置會類似這樣:

    <basic-authscheme:basic-auth-scheme
            id="josso-basic-authentication"
            ignorePasswordCase="false"
            ignoreUserCase="false">

        <basic-authscheme:credentialStore>
            <s:ref bean="josso-identity-store"/>
        </basic-authscheme:credentialStore>

        <basic-authscheme:credentialStoreKeyAdapter>
            <s:ref bean="josso-simple-key-adapter"/>
        </basic-authscheme:credentialStoreKeyAdapter>

    </basic-authscheme:basic-auth-scheme>


之後就可以正常登入了:

[設計模式] Strategy Pattern(策略模式) Part 2

Strategy Pattern(策略模式) Part 1裡面我們提到,如果我們裡用繼承父類別的方法,就會造成子類別被強迫實作他不需要的方法,有沒有更好的方式呢?

我們觀察到,每個角色共同擁有的功能是【攻擊】,只是攻擊的武器不同,因此,我們可以把攻擊這個方法獨立抽出來。先建立一個叫做Attack的Interface:


public interface Attack
{
    void useWeapon();
}


接著我們針對三個武器建立三個Class,分別是KnifeBehavior、SwordBehavior和AxeBehavior,同時這三個類別要去實作Attack這個介面:


public class KnifeBehavior implements Attack
{
     public void useWeapon()
     {
          System.out.println("Attack by Knife");
     }
}



public class SwordBehavior implements Attack
{
     public void useWeapon()
     {
          System.out.println("Attack by Sword");
     }
}



public class AxeBehavior implements Attack
{
     public void useWeapon()
     {
          System.out.println("Attack by Axe");
     }
}


接著,我們可以在原來角色的類別(Character)中,增加一個 setFightAction(Attack attack);的方法,這個方法可以讓實作他的角色類別依照需要來動態的產生不同的攻擊方法,因此,我們原本的角色類別變成:

public abstract class Character {
    public abstract void fight();
    public abstract void action();
    public abstract void char();
    public abstract void setFightAction(Attack attack);
}

如此一來,實作角色類別的個別角色(King、Queen和Knight)的程式就會變成:

public class King extends Character {

     Attack attack;

     @Override
     public void action() {}

     @Override
     public void chat() {}

     @Override
     public void fight() {
          f.useWeapon();
     }

     @Override
     public void setFightAction(Attack attack) {
          this.attack = attack;
     }
}


最後,我們要使用每個角色時,只需要這樣寫:

public class PlayGame {
    public static void main(String [] a) {
        King kevingo = new King();
        kevingo.setFightAction(new KnifeBehavior());
        kevingo.fight();

        Queen mary = new Queen();
        mary.setFightAction(new SwordBehavior());
        mary.fight();

        Knight tom = new Knight();
        tom.setFightAction(new KnifeBehavior());
        tom.fight();
    }
}


往後,當我們需要有新的攻擊方式時,只需要重新建立一個新的攻擊類別,而如果皇后要改拿其他的武器時,也只要在setFightAction中指定新的攻擊類別,真是太好了!

再回顧一下Strategy Pattern的定義:

  • 策略模式在於觀察程式中變動的部分,並且將他們抽離出來封裝成可互相抽換的演算法家族。這個模式讓你即使任意更換實作的演算法,也不會變動到去使用者他們的客戶端程式。

在這個範例中,我們把不同型態的攻擊方法抽出來變成一組家族,建立一個Interface叫做Attack,同時根據不同的攻擊方法來建立不同的類別,往後我們只要利用set方法就可以輕鬆的替換攻擊的方式,這就是策略模式的用途所在。

當然這個模式不是沒有缺點,最顯而易見缺點就是他必須要維護比較多的類別,當實作的策略變多的時候,維護起來就會比較吃力囉。

在Visual Studio找不到DLL Reference?先確定Target Framework吧!

最近在練習C#程式開發時,偶而會碰到要reference某個dll的時候,找不到相對應的namespace,後來上網尋找了一下,發現不是這顆DLL消失了,而是Project裡面的Target Framework被設定為Client Profile的形式。


至於Client Profile和一般的.NET Framework有什麼不同,可以參考msdn上面的這篇文章:

.NET Framework Client Profile

另外這一篇文章也寫得不錯:

What’s new in .NET Framework 4 Client Profile RTM

簡而言之,Client Profile算是一個Compact Version,如果你要開發Web Service,也許可以用,但如果是桌面端AP的話,建議還是用原本的.NET Framework,比較可以省掉一些麻煩囉。

[設計模式] Singleton Pattern (單例模式) Part1

最近在學習Hibernate的時候,發現在原廠的Documentation裡面,使用了Singleton Pattern這樣的模式,就讓我藉由這篇文章複習一下Design Pattern吧。

設計模式在軟體開發中,指的是如何運用一個良好的思維邏輯來進行程式碼架構的規劃及撰寫。提到設計模式,一定會提到Gof等四位作者所撰寫的這本書吧:


今天想要介紹並且讓我自己複習的正是Singleton Pattern(單例模式)。Singleton Pattern在設計上是希望確保一個類別在系統運行的時候,只有一個實體(instance)產生,同時,這個類別必須要提供一個公開的方法讓其他人取得自己的實體。為什麼我們要使用者這個模式?

在某些情況下,你的程式只會希望有一個物件的實體存在,比如說,連接資料庫的物件、程式管理員的物件、處理印表機列印的類別等等。如果這些物件可以有多個實體,那每次需要這些功能的時候,我們都可以任意的new一個實體出來進行操作,這樣會造成相當恐怖的結果。

如果把Singleton Pattern實作出來,長相會是這樣


public class Singleton {

    private static Singleton instance;

    private Singleton () { }

    public static Singleton getInstance() {
      if(instance==null)
        instance = new Singleton();
      return instance;
    }
}

這段程式碼的重點有三個:

  1. 要有一個私有(private)的靜態(static)方法:用來紀錄類別的實體。因為是私有的,所以外部沒辦法直接透過Singleton.instance來存取。
  2. 類別擁有一個私有的建構子:其他的方法沒辦法直接產生這個類別的實體,說的白話一點,就是不能夠用new Singleton()這樣的方式來產生實體,這是重點所在。
  3. 擁有一個公開取得物件實體的方法:由於是私有建構子(private constructor)的原因,要產生這個類別的實體,只能靠自己類別內的方法產生。但是又必須要讓外部能夠呼叫,所以要設定為公開的靜態方法
這種方式又稱為【Lazy Instantization】,中文可以翻作【延遲實體化】。為什麼呢?因為我們可以看到,我們只有需要這個物件的時候,利用Singleton.getInstance()這樣的方法來取得Singleton這個類別的實體,不需要的時候就不會產生,所以叫做延遲的實體化方法。

要怎麼驗證呢?很簡單,寫一個小程式測試一下就好了,兩個實體的hashcode應該是相同的囉:

Singleton instance1 = Singleton.getInstance();
Singleton instance2 = Singleton.getInstance();
System.out.println(instance1.hashCode());
System.out.println(instance2.hashCode());

Lazy Instantization的方法在Single Thread的程式中是可以正確運作的,但是當你的程式有兩個或兩個以上的threads在跑的時候,就會出現問題,這個部份我們留到part2再談囉!