在Linux的環境中,大部分的設定都是標準的文字檔,那要如何取得那些設定的資料呢?
如果我們是用QT開發的話,可以用以下的方式
1. 利用QFile以文字檔的方式開啟設定檔
2. 將設定檔中的資料一行一行的讀出
範例1: 判斷系統是否存在特定型號的DVD
bool isFindDVD()
{
QFile procDVD("/proc/scsi/sg/device_strs");
if (!procDVD.open(QIODevice::ReadOnly | QIODevice::Text))
return false;
QString line;
while(1) {
line = QString(procDVD.readLine());
if (line.isEmpty()) break;
eprintf("isFindDVD = %s\n", qPrintable(line));
if ((line.contains("ATAPI")) && (line.contains("DVD"))) {
return true;
}
}
return false;
}
範例2: 取得 CPU的型號
QString cpuModel()
{
QFile procCPU("/proc/cpuinfo");
if (!procCPU.open(QIODevice::ReadOnly | QIODevice::Text))
return "";
QString line;
while (1) {
line = QString(procCPU.readLine());
if (line.isEmpty()) break;
if (line.contains("model name")) {
return line;
}
}
return "";
}
搜尋此網誌
2009年10月20日 星期二
2009年10月9日 星期五
Function template
Function template 是一種可以依傳入型別的不同,自動產生特定函事實體的方法
Function template最簡單的的定義方法如下:
template
MyType min (MyType a, MyType b) {
return (a < b) ? a : b;
}
其中 < class MyType >, 代表是 template 的參數列, 意即 MyType的型別是可經由傳入的參數改變其型別.
例如, 我們如下的方式呼叫
min(10, 100); // int, int
則產生的函式實體為
int min (int a, int b) {
return (a < b) ? a : b;
}
因為,傳入的參數型態為整數,所以 MyType 的型態就變成了 int.
假設我們呼叫的方式為
min(10.0, 100.0); //double, double
則產生的函式實體為
double min (double a, double b) {
return (a < b) ? a : b;
}
當然, 參數列的參數,不以一個為限,它可以有多個參數
如:
template
Type1 findMax(Type1 a, Type2 b)
{
return ( a > b) ? a : b;
}
假設我們呼叫的方式為
findMax(10, 100.0); // int, double
則產生的函式實體為
int findMax(int a, double b) {
return ( a > b) ? a : b;
}
其中 Type1被 int取代,而 Type2 被double取代.
--------------------------------------------------
然而參數列的參數,不僅僅是要型別參數,也可以是非型別參數,所謂的非型別參數所代表的即為一個數值,這個數值在template的定義式中式一個常數
如:
template
Type min(Type (&arr) [size]) {
………
}
其中的 int size 即為非型別參數
假設我們已如下的方法呼叫
Int i;
int ia[] = {1, 2, 3};
i = min(ia);
則產生的函式實體為
int min(int (&arr) [3]) {
………
}
其中 Type被 int取代, 而 size 被3取代 (因為 ia這個這個陣列有三個元素).
Function template最簡單的的定義方法如下:
template
MyType min (MyType a, MyType b) {
return (a < b) ? a : b;
}
其中 < class MyType >, 代表是 template 的參數列, 意即 MyType的型別是可經由傳入的參數改變其型別.
例如, 我們如下的方式呼叫
min(10, 100); // int, int
則產生的函式實體為
int min (int a, int b) {
return (a < b) ? a : b;
}
因為,傳入的參數型態為整數,所以 MyType 的型態就變成了 int.
假設我們呼叫的方式為
min(10.0, 100.0); //double, double
則產生的函式實體為
double min (double a, double b) {
return (a < b) ? a : b;
}
當然, 參數列的參數,不以一個為限,它可以有多個參數
如:
template
Type1 findMax(Type1 a, Type2 b)
{
return ( a > b) ? a : b;
}
假設我們呼叫的方式為
findMax(10, 100.0); // int, double
則產生的函式實體為
int findMax(int a, double b) {
return ( a > b) ? a : b;
}
其中 Type1被 int取代,而 Type2 被double取代.
--------------------------------------------------
然而參數列的參數,不僅僅是要型別參數,也可以是非型別參數,所謂的非型別參數所代表的即為一個數值,這個數值在template的定義式中式一個常數
如:
template
Type min(Type (&arr) [size]) {
………
}
其中的 int size 即為非型別參數
假設我們已如下的方法呼叫
Int i;
int ia[] = {1, 2, 3};
i = min(ia);
則產生的函式實體為
int min(int (&arr) [3]) {
………
}
其中 Type被 int取代, 而 size 被3取代 (因為 ia這個這個陣列有三個元素).
2009年9月29日 星期二
Function Pointer(C)、Delegate(C#) 和Function Object(C++)
摘自 http://oomusou.cnblogs.com
Abstract
Function Pointer(C)、Delegate(C#)和Function Object(C++)這三個其實是一樣的功能,所以在此一併討論。
Introduction
function pointer是C語言中最高級的機制,大概很多人還沒上到這裡已經學期末了,所以不少C語言工程師根本不知道C語言有function pointer;而C#的delegate大抵跟C語言的function pointer功能相同,所以很多書說delegate是物件導向的function pointer;C++的function object功能則比function pointer略強,還可配合泛型使用。
為什麼會需要function pointer、delegate、function object這種機制呢?源於一個很簡單的想法:『為什麼我們不能將function也如同變數一樣傳進另外一個function呢?』,C語言的解決方式是,利用pointer指向該function,將該pointer傳入另外一個function,只要將該pointer dereference後,就如同存取原function一樣。C#解決的方式是,將function包成delegate object,傳入另外一個function。C++的解決方式是,利用class或struct將function包成object,傳入另外一個 function。
一個很簡單的需求,想個別列出陣列中,所有奇數、偶數、和大於2的數字,若使用傳統方式,而不使用function pointer,則寫法如下
1#include
2
3using namespace std;
4
5void printArrayOdd(int* beg, int* end) {
6 while(beg != end) {
7 if ((*beg)%2)
8 cout << *beg << endl;
9
10 beg++;
11 }
12}
13
14void printArrayEven(int* beg, int* end) {
15 while(beg != end) {
16 if (!((*beg)%2))
17 cout << *beg << endl;
18
19 beg++;
20 }
21}
22
23void printArrayGreaterThan2(int* beg, int* end) {
24 while(beg != end) {
25 if ((*beg)>2)
26 cout << *beg << endl;
27
28 beg++;
29 }
30}
31
32int main() {
33 int ia[] = {1, 2, 3};
34
35 cout << "Odd" << endl;
36 printArrayOdd(ia, ia + 3);
37
38
39 cout << "Even" << endl;
40 printArrayEven(ia, ia + 3);
41
42 cout << "Greater than 2" << endl;
43 printArrayGreaterThan2(ia, ia + 3);
44}
執行結果
Odd
1
3
Even
2
Greater than 2
3
以功能而言沒有問題,但每個function都要做迴圈與判斷,似乎重覆了,而且將來若有新的判斷,又要copy整個迴圈,然後改掉判斷式,若能將迴圈與判斷式分離,若日後有新的判斷式,只要將該判斷式傳進來即可,這就是function pointer概念。
使用C語言的Function Pointer
1/**//*
2(C) OOMusou 2007 http://oomusou.cnblogs.com
3
4Filename : FuntionPointer.cpp
5Compiler : Visual C++ 8.0 / BCB 6.0 / gcc 3.4.2 / ISO C++
6Description : Demo how to use function pointer
7Release : 05/01/2007 1.0
8*/
9#include
10
11using namespace std;
12
13typedef bool (*predicate)(int);
14
15bool isOdd(int i) {
16 return i%2? true : false;
17}
18
19bool isEven(int i) {
20 return i%2? false : true;
21}
22
23bool greaterThan2(int i) {
24 return i > 2;
25}
26
27void printArray(int* beg, int* end, predicate fn) {
28 while(beg != end) {
29 if ((*fn)(*beg))
30 cout << *beg << endl;
31
32 beg++;
33 }
34}
35
36int main() {
37 int ia[] = {1, 2, 3};
38
39 cout << "Odd" << endl;
40 printArray(ia, ia + 3, isOdd);
41
42 cout << "Even" << endl;
43 printArray(ia, ia + 3, isEven);
44
45 cout << "Greater than 2" << endl;
46 printArray(ia, ia + 3, greaterThan2);
47}
執行結果
Odd
1
3
Even
2
Greater than 2
3
第13行
typedef bool (*predicate)(int);
宣告了predicate這個function ponter型別,指向回傳值為bool,參數為int的function,值得注意的是(*predicate)一定要括號刮起來,否則 compiler會以為是bool*,我承認這個語法很奇怪,但若仔細想想,若我是C語言發明者,我應該也是這樣定語法,因為也沒其他更好的語法了:D。
這個範例將判斷式和迴圈分開,日後若有新的判斷式,只要新增判斷式即可,funtion pointer提供了一個型別,讓參數可以宣告function pointer型別
void printArray(int* beg, int* end, predicate fn) {
如此我們就可以將function傳進另外一個fuction了。
使用C#的Delegate
C#是個物件導向的語言,為了提供類似function pointer的機制,提出了delegate概念,delegate英文是『委託、代表』,表示可以代表一個function,可以將delegate想成物件導向的function pointer。
1/**//*
2(C) OOMusou 2007 http://oomusou.cnblogs.com
3
4Filename : Delegate.cs
5Compiler : Visual Studio 2005 / C# 2.0
6Description : Demo how to use delegate
7Release : 05/01/2007 1.0
8*/
9
10using System;
11
12class main {
13 public delegate bool predicate(int i);
14
15 public static bool isOdd(int i) {
16 return (i % 2) > 0? true : false;
17 }
18
19 public static bool isEven(int i) {
20 return ((i % 2) > 0? false : true);
21 }
22
23 public static bool greaterThan2(int i) {
24 return i > 2;
25 }
26
27 public static void printArray(int[] arr, int size, predicate fn) {
28 for(int i = 0; i != size; ++i) {
29 if (fn(arr[i]))
30 Console.WriteLine(arr[i].ToString());
31 }
32 }
33
34 public static void Main() {
35 int[] ia = {1, 2, 3};
36
37 Console.WriteLine("Odd");
38 printArray(ia, 3, new predicate(isOdd));
39
40 Console.WriteLine("Even");
41 printArray(ia, 3, new predicate(isEven));
42
43 Console.WriteLine("Greater than 2");
44 printArray(ia, 3, new predicate(greaterThan2));
45 }
46}
執行結果
Odd
1
3
Even
2
Greater than 2
3
整個C#程式和C語言程式幾乎是一對一對應,定義function pointer型別變成了13行
public delegate bool predicate(int i);
表示predicate是一個delegate型別,代表一個迴傳為bool,參數為int的function。
而原來宣告function pointer型態的參數,則改成delegate型態
public static void printArray(int[] arr, int size, predicate fn) {
使用C++的Function Object
function object也稱為functor,用class或struct都可以,因為function object是利用constructor和對operator()做overloading,而這些都是public的,所以大部分人就直接使用 struct,可少打public:這幾個字。
1/**//*
2(C) OOMusou 2007 http://oomusou.cnblogs.com
3
4Filename : FuntionObject.cpp
5Compiler : Visual C++ 8.0 / BCB 6.0 / gcc 3.4.2 / ISO C++
6Description : Demo how to use function object
7Release : 05/01/2007 1.0
8*/
9#include
10
11using namespace std;
12
13template
14struct isOdd {
15 bool operator() (T i) {
16 return i%2? true : false;
17 }
18};
19
20template
21struct isEven {
22 bool operator() (T i) {
23 return i%2? false : true;
24 }
25};
26
27template
28struct greaterThan2 {
29 bool operator() (T i) {
30 return i > 2;
31 }
32};
33
34template
35struct greaterThanAny {
36 T _val;
37 greaterThanAny(T n) : _val(n) {}
38 bool operator() (T i) {
39 return i > _val;
40 }
41};
42
43
44template
45void printArray(T beg, T end, U fn) {
46 while(beg != end) {
47 if (fn(*beg))
48 cout << *beg << endl;
49
50 beg++;
51 }
52};
53
54int main() {
55 int ia[] = {1, 2, 3};
56
57 cout << "Odd" << endl;
58 printArray(ia, ia + 3, isOdd());
59
60 cout << "Even" << endl;
61 printArray(ia, ia + 3, isEven());
62
63 cout << "Greater than 2" << endl;
64 printArray(ia, ia + 3, greaterThan2());
65
66 cout << "Greater than any" << endl;
67 printArray(ia, ia + 3, greaterThanAny(1));
68}
執行結果
Odd
1
3
Even
2
Greater than 2
3
Greater than any
2
3
13行
template
struct isOdd {
bool operator() (T i) {
return i%2? true : false;
}
};
使用了template,不過並非必要,只是顯示function object可以搭配template使用,而使用的技巧只是將function內的東西搬到operator()內。
34行
template
struct greaterThanAny {
T _val;
greaterThanAny(T n) : _val(n) {}
bool operator() (T i) {
return i > _val;
}
};
是function object優於function pointer和delegate之處,由C語言和C#的範例可知,我們只能寫一個greaterThan2()的判斷式,若今天需求改變成 greaterThan3,則又得再寫一個判斷式了,但因為function object是透過struct和class,別忘了struct和class還有個constructor,所以能藉由constructor對 class做初始化,因此才能寫出greaterThanAny(),大於多少只要當成constructor帶入即可,而operator()的寫法一樣不變。
Conclusion
C語言、C#、C++皆提供了『將函數傳到另外一個函數』的機制,function pointer和delegate相當類似,而funtion object則功能更強。這裡澄清一個觀念,很多人認為function object就是為了要使用STL的algorithm才使用,這是標準的錯誤觀念,這是果而非因,因為STL的algorithm使用了 function object的方式,所以我們才去配合,並不是只用在這個地方,事實上,我們自己的也可以使用function object,而且其比function pointer優越之處就在於function object多了constructor,所以比function pointer彈性更大。
Abstract
Function Pointer(C)、Delegate(C#)和Function Object(C++)這三個其實是一樣的功能,所以在此一併討論。
Introduction
function pointer是C語言中最高級的機制,大概很多人還沒上到這裡已經學期末了,所以不少C語言工程師根本不知道C語言有function pointer;而C#的delegate大抵跟C語言的function pointer功能相同,所以很多書說delegate是物件導向的function pointer;C++的function object功能則比function pointer略強,還可配合泛型使用。
為什麼會需要function pointer、delegate、function object這種機制呢?源於一個很簡單的想法:『為什麼我們不能將function也如同變數一樣傳進另外一個function呢?』,C語言的解決方式是,利用pointer指向該function,將該pointer傳入另外一個function,只要將該pointer dereference後,就如同存取原function一樣。C#解決的方式是,將function包成delegate object,傳入另外一個function。C++的解決方式是,利用class或struct將function包成object,傳入另外一個 function。
一個很簡單的需求,想個別列出陣列中,所有奇數、偶數、和大於2的數字,若使用傳統方式,而不使用function pointer,則寫法如下
1#include
2
3using namespace std;
4
5void printArrayOdd(int* beg, int* end) {
6 while(beg != end) {
7 if ((*beg)%2)
8 cout << *beg << endl;
9
10 beg++;
11 }
12}
13
14void printArrayEven(int* beg, int* end) {
15 while(beg != end) {
16 if (!((*beg)%2))
17 cout << *beg << endl;
18
19 beg++;
20 }
21}
22
23void printArrayGreaterThan2(int* beg, int* end) {
24 while(beg != end) {
25 if ((*beg)>2)
26 cout << *beg << endl;
27
28 beg++;
29 }
30}
31
32int main() {
33 int ia[] = {1, 2, 3};
34
35 cout << "Odd" << endl;
36 printArrayOdd(ia, ia + 3);
37
38
39 cout << "Even" << endl;
40 printArrayEven(ia, ia + 3);
41
42 cout << "Greater than 2" << endl;
43 printArrayGreaterThan2(ia, ia + 3);
44}
執行結果
Odd
1
3
Even
2
Greater than 2
3
以功能而言沒有問題,但每個function都要做迴圈與判斷,似乎重覆了,而且將來若有新的判斷,又要copy整個迴圈,然後改掉判斷式,若能將迴圈與判斷式分離,若日後有新的判斷式,只要將該判斷式傳進來即可,這就是function pointer概念。
使用C語言的Function Pointer
1/**//*
2(C) OOMusou 2007 http://oomusou.cnblogs.com
3
4Filename : FuntionPointer.cpp
5Compiler : Visual C++ 8.0 / BCB 6.0 / gcc 3.4.2 / ISO C++
6Description : Demo how to use function pointer
7Release : 05/01/2007 1.0
8*/
9#include
10
11using namespace std;
12
13typedef bool (*predicate)(int);
14
15bool isOdd(int i) {
16 return i%2? true : false;
17}
18
19bool isEven(int i) {
20 return i%2? false : true;
21}
22
23bool greaterThan2(int i) {
24 return i > 2;
25}
26
27void printArray(int* beg, int* end, predicate fn) {
28 while(beg != end) {
29 if ((*fn)(*beg))
30 cout << *beg << endl;
31
32 beg++;
33 }
34}
35
36int main() {
37 int ia[] = {1, 2, 3};
38
39 cout << "Odd" << endl;
40 printArray(ia, ia + 3, isOdd);
41
42 cout << "Even" << endl;
43 printArray(ia, ia + 3, isEven);
44
45 cout << "Greater than 2" << endl;
46 printArray(ia, ia + 3, greaterThan2);
47}
執行結果
Odd
1
3
Even
2
Greater than 2
3
第13行
typedef bool (*predicate)(int);
宣告了predicate這個function ponter型別,指向回傳值為bool,參數為int的function,值得注意的是(*predicate)一定要括號刮起來,否則 compiler會以為是bool*,我承認這個語法很奇怪,但若仔細想想,若我是C語言發明者,我應該也是這樣定語法,因為也沒其他更好的語法了:D。
這個範例將判斷式和迴圈分開,日後若有新的判斷式,只要新增判斷式即可,funtion pointer提供了一個型別,讓參數可以宣告function pointer型別
void printArray(int* beg, int* end, predicate fn) {
如此我們就可以將function傳進另外一個fuction了。
使用C#的Delegate
C#是個物件導向的語言,為了提供類似function pointer的機制,提出了delegate概念,delegate英文是『委託、代表』,表示可以代表一個function,可以將delegate想成物件導向的function pointer。
1/**//*
2(C) OOMusou 2007 http://oomusou.cnblogs.com
3
4Filename : Delegate.cs
5Compiler : Visual Studio 2005 / C# 2.0
6Description : Demo how to use delegate
7Release : 05/01/2007 1.0
8*/
9
10using System;
11
12class main {
13 public delegate bool predicate(int i);
14
15 public static bool isOdd(int i) {
16 return (i % 2) > 0? true : false;
17 }
18
19 public static bool isEven(int i) {
20 return ((i % 2) > 0? false : true);
21 }
22
23 public static bool greaterThan2(int i) {
24 return i > 2;
25 }
26
27 public static void printArray(int[] arr, int size, predicate fn) {
28 for(int i = 0; i != size; ++i) {
29 if (fn(arr[i]))
30 Console.WriteLine(arr[i].ToString());
31 }
32 }
33
34 public static void Main() {
35 int[] ia = {1, 2, 3};
36
37 Console.WriteLine("Odd");
38 printArray(ia, 3, new predicate(isOdd));
39
40 Console.WriteLine("Even");
41 printArray(ia, 3, new predicate(isEven));
42
43 Console.WriteLine("Greater than 2");
44 printArray(ia, 3, new predicate(greaterThan2));
45 }
46}
執行結果
Odd
1
3
Even
2
Greater than 2
3
整個C#程式和C語言程式幾乎是一對一對應,定義function pointer型別變成了13行
public delegate bool predicate(int i);
表示predicate是一個delegate型別,代表一個迴傳為bool,參數為int的function。
而原來宣告function pointer型態的參數,則改成delegate型態
public static void printArray(int[] arr, int size, predicate fn) {
使用C++的Function Object
function object也稱為functor,用class或struct都可以,因為function object是利用constructor和對operator()做overloading,而這些都是public的,所以大部分人就直接使用 struct,可少打public:這幾個字。
1/**//*
2(C) OOMusou 2007 http://oomusou.cnblogs.com
3
4Filename : FuntionObject.cpp
5Compiler : Visual C++ 8.0 / BCB 6.0 / gcc 3.4.2 / ISO C++
6Description : Demo how to use function object
7Release : 05/01/2007 1.0
8*/
9#include
10
11using namespace std;
12
13template
14struct isOdd {
15 bool operator() (T i) {
16 return i%2? true : false;
17 }
18};
19
20template
21struct isEven {
22 bool operator() (T i) {
23 return i%2? false : true;
24 }
25};
26
27template
28struct greaterThan2 {
29 bool operator() (T i) {
30 return i > 2;
31 }
32};
33
34template
35struct greaterThanAny {
36 T _val;
37 greaterThanAny(T n) : _val(n) {}
38 bool operator() (T i) {
39 return i > _val;
40 }
41};
42
43
44template
45void printArray(T beg, T end, U fn) {
46 while(beg != end) {
47 if (fn(*beg))
48 cout << *beg << endl;
49
50 beg++;
51 }
52};
53
54int main() {
55 int ia[] = {1, 2, 3};
56
57 cout << "Odd" << endl;
58 printArray(ia, ia + 3, isOdd
59
60 cout << "Even" << endl;
61 printArray(ia, ia + 3, isEven
62
63 cout << "Greater than 2" << endl;
64 printArray(ia, ia + 3, greaterThan2
65
66 cout << "Greater than any" << endl;
67 printArray(ia, ia + 3, greaterThanAny
68}
執行結果
Odd
1
3
Even
2
Greater than 2
3
Greater than any
2
3
13行
template
struct isOdd {
bool operator() (T i) {
return i%2? true : false;
}
};
使用了template,不過並非必要,只是顯示function object可以搭配template使用,而使用的技巧只是將function內的東西搬到operator()內。
34行
template
struct greaterThanAny {
T _val;
greaterThanAny(T n) : _val(n) {}
bool operator() (T i) {
return i > _val;
}
};
是function object優於function pointer和delegate之處,由C語言和C#的範例可知,我們只能寫一個greaterThan2()的判斷式,若今天需求改變成 greaterThan3,則又得再寫一個判斷式了,但因為function object是透過struct和class,別忘了struct和class還有個constructor,所以能藉由constructor對 class做初始化,因此才能寫出greaterThanAny(),大於多少只要當成constructor帶入即可,而operator()的寫法一樣不變。
Conclusion
C語言、C#、C++皆提供了『將函數傳到另外一個函數』的機制,function pointer和delegate相當類似,而funtion object則功能更強。這裡澄清一個觀念,很多人認為function object就是為了要使用STL的algorithm才使用,這是標準的錯誤觀念,這是果而非因,因為STL的algorithm使用了 function object的方式,所以我們才去配合,並不是只用在這個地方,事實上,我們自己的也可以使用function object,而且其比function pointer優越之處就在於function object多了constructor,所以比function pointer彈性更大。
2009年9月6日 星期日
華山-台灣設計師週半日遊
2009年7月20日 星期一
bit 運算
bit的運算其實沒啥了不起,但除非是作跟硬體相關的程式設計,用到的機會還真是不多.
但很不巧的是,有時就是偏偏會碰上,更不巧的是.因為很少碰.所以也就不知道該怎麼寫處理bit的程式.
其實在C++是使用bitset這個class
bitset的操作行為:
範例1 (開啟某個bit):
但很不巧的是,有時就是偏偏會碰上,更不巧的是.因為很少碰.所以也就不知道該怎麼寫處理bit的程式.
其實在C++是使用bitset這個class
bitset的操作行為:
| any | true if any bits are set |
| count | returns the number of set bits |
| flip | reverses the bitset |
| none | true if no bits are set |
| reset | sets bits to zero |
| set | sets bits |
| size | number of bits that the bitset can hold |
| test | returns the value of a given bit |
| to_string | string representation of the bitset |
| to_ulong | returns an integer representation of the bitset |
範例1 (開啟某個bit):
#include
#include
using namespace std;
int main ()
{
bitset<4> mybits;
cout << class="comm">// 1111
cout << class="comm">// 1011
cout << class="comm">// 1111
return 0;
}
範例2:
#include
#include
#include
using namespace std;
int main (關閉某個bit)
{
bitset<4> mybits (string("1011"));
cout << class="comm">// 1001
cout << class="comm">// 0000
return 0;
}
2009年7月11日 星期六
品牌與設計
品牌是包含了設計,軟體,硬體與服務.
設計這個名詞代表的涵義很廣.
工業設計是設計,但我熟悉的電腦程式設計也是設計.
其實當設計去除的商業價值之後,它就是一個藝術
工業設計是藝術,程式設計也是藝術
那是發自於人心的自然感動.
自然也就沒有軟體、硬體、服務與品牌.那些充滿商業的包裝.
工程師通常很工程導向,設計師通常很設計導向..但這樣並不是好事.
因為那會造成判斷上的偏頗,
我個人認為如果作為商業(經濟價值)導向的設計,就必須把本身的專業放到第二順位.,
譬如我是學程式設計,我就要把程式設計的重要性放在次要.如此才能看到其他元素的重要性及其影響性.
如此一來,才有利於結合其他元素的特點,開發出更有特色的品牌
設計這個名詞代表的涵義很廣.
工業設計是設計,但我熟悉的電腦程式設計也是設計.
其實當設計去除的商業價值之後,它就是一個藝術
工業設計是藝術,程式設計也是藝術
那是發自於人心的自然感動.
自然也就沒有軟體、硬體、服務與品牌.那些充滿商業的包裝.
工程師通常很工程導向,設計師通常很設計導向..但這樣並不是好事.
因為那會造成判斷上的偏頗,
我個人認為如果作為商業(經濟價值)導向的設計,就必須把本身的專業放到第二順位.,
譬如我是學程式設計,我就要把程式設計的重要性放在次要.如此才能看到其他元素的重要性及其影響性.
如此一來,才有利於結合其他元素的特點,開發出更有特色的品牌
2009年7月5日 星期日
後現代主義設計 (Post Modern)
訂閱:
文章 (Atom)








