Joe Horn 的啟示錄
Joe Horn's Blog
  • LinkedIn
  • Facebook
  • Instagram
  • GitHub
  • Docker Hub
RSS
  • VPS Referrals
  • My Plurk
  • My Plurk Bot

10 月 8 2009

在 Visual Studio 2008 設定 Windows Form 的圖示

最近在玩 C#,寫個小軟體。
不過,我發現我產生出來的 exe 檔就是很醜,看起來的感覺就好像是病毒檔… (羞)
用 MSDN 跟上網搜尋,solution 也不算好找,所以寫這篇順便幫自己紀錄一下。

Windows Form 有兩種圖示可以設定:

  • Form 的圖示:只要在 Form 的屬性中,更改 Icon 屬性的 Value 就好,設定的圖示會顯示在執行的視窗的左上角。
  • Application 的圖示:在 Visual Studio 2008 中,最上方工具列的 專案 -> [專案名稱]屬性,開啟的分頁中的 應用程式 有個 圖示與資訊清單 項目。在此便可設定軟體圖示。

By the way,我覺得目前寫這個小軟體應該還算實用,寫完後再丟上來~ 8-)

By Joe Horn • .NET 1 • Tags: icon, Visual Studio, Windows Form

9 月 27 2009

[分享] 謹慎使用 Smarty 樣板的 {include} …

以下是在 PTT 的 PHP 板看到某篇文章後的心得,以及小小的經驗分享。

對 Smarty 稍有經驗的人,應該都知道樣板內可使用 {include} 這個 tag 來嵌入其他 template file。
然而,因為 Smarty 內的變數都是全域變數,所以我對這個 tag 的看法是「能不用,就不用」。

用常見的網站論壇系統舉個簡單的例子:

  • A 設計師負責開發顯示 HTML header 的 template,使用了 $title 變數作為 page title,ex:
    <html><head><title>$title</title></head>
  • B 設計師負責開發顯示論壇文章內容的 template,恰巧也使用了 $title 作為文章標題。

若 B 設計師在其 template file 中使用了 {include} 來嵌入 A 設計師的 template file,就可能會產生預期之外的顯示結果。

當然,若是開發團隊已事先溝通好各項變數的命名,就不會有這種情況。
但為了減少此類風險,降低 debug 的難度,我們會選擇使用這種方式:

  • 在系統全域共用的函式檔案中增加負責顯示 HTML header 的 function,例如 function page_header($title) { …} ,並在 function 中 assign 變數,引入 A 設計師開發的 template file。
  • 在論壇文章內容顯示的程式檔中,呼叫 page_header($title),再 assign 文章標題的變數,引入 B 設計師開發的 template file。

當然,若嵌入的 template file 內沒有任何變數,就不須考量以上的狀況,開發/設計人員可以大膽地隨意使用。 8-)

By Joe Horn • PHP 1 • Tags: include, PHP, Smarty

9 月 9 2009

中文界面圖形驗證碼的新選擇 – reCAPTCHA

昨晚,有個學長透過 MSN 問我有無簡單好用的 PHP 圖形驗證碼,又讓我想到 reCAPTCHA。
上一次使用時,reCAPTCHA 僅提供顏色變更;如今,reCAPTCHA 已經開始支援多國語言了。

剛才稍微玩了一下,寫了這個簡單的網頁。
reCAPTCHA 的多國語言化相關資訊可以參考 這裡,而我使用的中文化程式碼片段為:

<script type="text/javascript">
var RecaptchaOptions = {
    custom_translations : {
        visual_challenge : "取得圖形驗證碼",
        audio_challenge : "取得音效驗證碼",
        refresh_btn : "重新整理圖形",
        instructions_visual : "輸入兩個英文單字:",
        instructions_audio : "輸入您聽到的聲音:",
        help_btn : "獲得協助",
        play_again : "重新播放音效",
        cant_hear_this : "將音效下載為 MP3",
        incorrect_try_again : "錯誤! 請再試一次"
    }
};
</script>

By Joe Horn • Javascript, PHP, WWW 1 • Tags: CAPTCHA, il8n, localization, PHP, reCAPTCHA

9 月 4 2009

開啟 Aptana 的 upload current file on save

以往我撰寫 PHP 的兩個工具是 vim 跟 jEdit(vim 比較常用)。
當時會選 jEdit 是因為 jEdit 提供了 FTP 遠端存取的功能,更改或新增的程式檔可以自動上傳到遠端主機。
昨天在 PTT 的 PHP 板看到有人提到 Aptana Studio,今天想到就抓來玩看看。

令我驚豔的是,Aptana Studio 也提供了遠端存取的功能,包括 FTP、FTPS、SFTP,以及各種版本控制系統。
不過,試了一下之後,發現它沒有辦法自動讓更改或新增的程式檔上傳到遠端主機,只能儲存後,再手動作 upload。
在網路上搜尋解決方法後,我卻發現工具列上的 Scripts -> Synchronize -> Upload Current File On Save 是壞掉的。 =_=|||

在即將放棄使用 Aptana Studio 時,我發現了 這個討論串,而且也順利解決自動上傳的問題。
討論串的內容有點亂,所以把解法整理在這邊,順便幫自己留個備份(以免以後又要找解法):

  1. 在 Aptana Studio 安裝的資料夾找出 upload_current_file_on_save.js 這個檔案,並編輯它。
  2. 在 header 的部份補上這兩行:
    Listener: commandService().addExecutionListener(this);
    Key: M1+S

    補完之後的 header 大概像這樣:

    /* Listener: commandService().addExecutionListener(this);
     * Currently an example script (disabled)> Copy as your own script, and modify
     * the Listener command as shown below
     *
     * Menu: Synchronize > Upload Current File On Save
     * Key: M1+S
     * Kudos: Ingo Muschenetz
     * License: EPL 1.0
     * DOM: http://localhost/com.aptana.ide.syncing.doms
     * DOM: http://download.eclipse.org/technology/dash/update/org.eclipse.eclipsemonkey.lang.javascript
     */
  3. 在檔案最後面補上這段:
    function main() {
       sync.uploadCurrentEditor();
    }
  4. 存檔並重新執行 Aptana Studio。

之後只要按下 Ctrl + s 儲存檔案,該檔案就會自動上傳到遠端主機囉。 :-D

By Joe Horn • Computer Software, Programing 1 • Tags: Aptana

5 月 29 2009

網頁系統的使用者驗證與 MySQL 的 “SELECT … LIMIT m,n”

幾個小時前,PTT 的 Database 板 又有人問到 MySQL 的 “SELECT … LIMIT m,n” 相關問題。
其實,在大多數的網頁系統中,”SELECT … LIMIT m,n” 應該是一定要用的語法,尤其是在使用者驗證時。

簡單舉例,MySQL 的 “SELECT …” 語法運作可說是拿著籃子去裝東西,若以 LIMIT 語法限制籃子裝東西的數量,MySQL 會在籃子裝滿後就停止動作,並傳回結果。
在網頁系統中,因為使用者帳號都是獨立的,所以,進行使用者登入驗證時,只需要抓出一筆資料來進行比對。

因此,在網頁系統中,我時常用這種語法來進行使用者登入的驗證:

SELECT `使用者身份` FROM `users` WHERE `username`='使用者名稱' AND `password`='雜湊後的密碼' LIMIT 1;

如果找不到資料,代表使用者的帳號/密碼錯誤。
而直接把密碼加入 WHERE 子句,不挑出來用程式比對則是為了杜絕 SQL Injection 導致的密碼外洩。

另外,這樣作也不錯:

SELECT `使用者身份` FROM `users` WHERE `username`='使用者名稱' AND `password`=PASSWORD( '雜湊前或雜湊後的密碼' ) LIMIT 1;

:-P

By Joe Horn • Database 0 • Tags: MySQL, performance

5 月 27 2009

WD3200BEVE 還蠻凶悍的嘛~

前陣子覺得手上這台 laptop 效能不好,用了一些軟體檢查了一下,發現硬碟效能頗低。
於是,買了一顆 WD3200BEVE 來換。

剛才心血來潮,用轉換線把舊的那顆 ST98832A 跟新的 WD3200BEVE 裝到 desktop 做測試。

  • ST98832A:
    ST98832A
  • WD3200BEVE:
    WD3200BEVE

平平都是 PATA、5400 rpm 的 2.5″ HDD,WD3200BEVE 還蠻凶悍的嘛~ :-P

By Joe Horn • Computer Hardware 0 • Tags: HDD

3 月 8 2009

好用的小軟體 – Process Explorer 與 Magic Process

Magic Process 是我用了好一段時間,也覺得蠻好用的軟體。
跟 Windows 內建的工作管理員比較起來,Magic Process 可以讓我們知道目前執行的程式,其程式檔案位於何處。
簡而言之,透過 Magic Process 可以檢查執行中程式是否為木馬或病毒(因為程式所在路徑不同)。

然而,最近發現我的 Firefox 瘋狂地佔用 CPU 資源,Magic Process 似乎不夠用,所以在網路上找了一些資料來查原因。

Microsoft TechNet 的 Process Explorer 也可以顯示出目前執行中的程式所在路徑。
Process Explorer
而且,Process Explorer 的 process properties 可以顯示出執行中的程式的各個 thread 詳細資料。
類似 Firefox 瘋狂地佔用 CPU 資源這種問題,使用Process Explorer 更容易找出原因。
Process Explorer-process properties

By Joe Horn • Computer Software 0 • Tags: Magic Process, Process Explorer

9 月 3 2008

FreeBSD i386 與 amd64 platform 的差異

除了已知的效能差異(以前用 Ubench 測過的,gaod 長輩也貢獻了一些資訊,都 紀錄在這)、預設支援的記憶體容量之外,這兩天又找出另外一項。

某台機器跑 FreeBSD i386 platform,搭配 PAE 與 SMP。
根據以往的經驗,這種記憶體容量超過 4G 的機器,我會選 amd64 platform。
(至少經手過的幾台機器到現在都很健康…)

近來這台機器的 MySQL daemon process 時常會掛掉…
追蹤 error log 之後,發現這種錯誤訊息:

Out of memory (Needed 16391 bytes)

我把錯誤訊息丟上 Google 後,才發現 FreeBSD i386 platform 版本,其預設之單 process 記憶體容量限制為 512 MB,而 MySQL daemon process 使用超過 512 MB 後就會噴出上述的錯誤訊息,接著就是嗝屁… (驚)

我沒碰過這種瓶頸,似乎是 amd64 platform 沒有這種限制。
i386 platform 遭遇到這種瓶頸的解法是在 /boot/loader.conf 裡面丟進類似這三行:

kern.maxdsiz=”2G”
kern.dfldsiz=”2G”
kern.maxssiz=”256M”

(拉高單 process 的記憶體容量限制,變為 2G)
然後 reboot,準備驗收成果…

By Joe Horn • Database, FreeBSD 0 • Tags: amd64, FreeBSD, i386, MySQL

8 月 30 2008

謹慎使用 MySQL 的 InnoDB storage engine…

幾個月前,我幫人家建置了一套網頁系統,用以觀察網站瀏覽趨勢。
想當然爾,這種系統勢必會對資料庫產生大量 INSERT 或 UPDATE 的 query,而且會保留大量歷史性資料。

為了使系統能快速存取後端資料庫,我將存放 raw data 資料表的 storage engine 設定為 InnoDB。
(因為 InnoDB 支援了 row lock。 (羞) )
並搭配定時執行的 script 整理資料,進行統計,並存放在 MyISAM 格式的資料表中。

最近,這套系統的後端資料庫伺服器,mysqld 三不五時會自行 restart,系統狀態也看似正常(根據他們的說法)。
追蹤後,發現 InnoDB 的運作狀態被忽略了…

光是其中一塊放置 raw data 的資料表就存放了三百多萬筆資料,佔用了 3xx MB 的空間,可是 innodb_buffer_pool_size 只有 256 MB,連 mysqldump 都無法完全撈出這塊資料表的內容…
追查程式後,發現原本用以刪除過期 raw data 的那些程式碼片段都被註解掉.. =_=|||

這段故事給我們幾個啟示:

  • InnoDB 拿來放 raw data 真的不錯,但是要定時整理,否則維護難度會提高…
  • 沒事別雞婆,胡亂更改人家的設計… XD

By Joe Horn • Database 0 • Tags: InnoDB, MySQL

8 月 16 2008

用 Postfix 擋偽造來源位址的信件

現在許多廣告信件都是亂丟,配合來源位址的偽造,可能造成主機在發信上有所阻礙。
例如這種狀況:

廣告信偽造的寄件位址是 [email protected],寄給 [email protected]。如果 example-host.com 沒有 no-this-user 這個使用者,那信件會被退到 [email protected],久而久之,example-host.com 可能會被 yahoo.com.tw 擋掉。

之前的文章 只提過 exim 上面的擋法,最近是摸出了 Postfix 的設定方式。

  1. 讓系統進行檢查,main.cf 要有這些片段:
    smtpd_restriction_classes =
            fakemail_yahoo
            fakemail_gmail
            ...
    #
    fakemail_yahoo = check_client_access pcre:/usr/local/etc/postfix/fake/yahoo
    fakemail_gmail = check_client_access pcre:/usr/local/etc/postfix/fake/gmail
    #
    smtpd_sender_restrictions =
            ...,
            check_sender_access hash:/usr/local/etc/postfix/fake/CHECK,
            ...
  2. 製作規則對應檔(/usr/local/etc/postfix/fake/CHECK),內容大致如下(中間的大空格用 tab 隔開):
    yahoo.com       fakemail_yahoo
    yahoo.com.tw    fakemail_yahoo
    gmail.com       fakemail_gmail
    ...
  3. 製作規則檔(以 /usr/local/etc/postfix/fake/yahoo 為例),內容如下(中間的大空格用 tab 隔開):
    /(^|\.)yahoo\.com$/     DUNNO
    /./                     REJECT Fake address
  4. 用 postmap 產生規則對應檔的 hash map,接著讓 postfix 重新讀入設定檔。

對了,如果有 MX server 的話,都得一起上,不然沒用。
跑了一段時間後,效果還真的蠻顯著的。 :-P

By Joe Horn • Mail 1 • Tags: anti spam, fake address, Postfix

«‹ 8 9 10 11›»

Site Info

All content on this Blog is licensed under CC BY-NC-SA 4.0

About Me

profile for Joe Horn at Stack Overflow, Q&A for professional and enthusiast programmers


My mail!

獅子座

Coffee Powered!

F1 fans

motoGP fans

Linkin Park

I am a Taiwanese!

Recent Comments

  • Avatar of johnpupu johnpupu: PHP 還有這個 phpsavant.c……
  • Avatar of Jerry Jerry: 这个不是foreach的问题。 0 ==……
  • Avatar of Joe Horn Joe Horn: 看來問題在 if ... else ..……
  • Avatar of jnlin jnlin: 因為 'b' 被轉型成 0 了…
  • Avatar of 路人 路人: 跟 foreach 沒有關係 ?…
  • Avatar of bill bill: 註冊表那裡要設定 BasicAuthLe……
  • Avatar of 虫 虫: .svn 的檔案減少可以增加在 wind……
  • Avatar of mars mars: 如果說寫程式是理性極致的話,那寫小說就是……
  • Avatar of Joe Horn Joe Horn: 已更新文章。…
  • Avatar of jackcal jackcal: joehorn.idv.tw關於轉貼 h……

Post Categories

  • About My Sites (16)
  • Computer Hardware (28)
  • Computer Software (45)
  • Database (23)
  • FreeBSD (21)
  • Funny (14)
  • Life (23)
  • Linux (5)
  • Mail (19)
  • Network (12)
  • Programing (40)
    • .NET (5)
    • JAVA (2)
    • Javascript (6)
    • PHP (29)
  • Thoughts (34)
  • Windows (13)
  • WWW (79)
    • phpBB (7)
    • WordPress (18)

Blogroll

  • 這裡沒有美食

Tags Cloud

AMD Apache benchmarking Bloglines Coppermine DNSBL eAccelerator fio Firefox free FreeBSD Gmail Google HDD Hsin-chu HTTPS IE Intel Javascript Lenovo Longhorn Microsoft MSN MySQL Office Percona XtraBackup performance PHP phpBB pirate Postfix restaurant RSS security sendmail software SpamAssassin SSL Subversion Taiwan theme translation Windows WordPress Yahoo

Ads

↑

© Joe Horn 的啟示錄 2025
Powered by WordPress • Themify WordPress Themes