|
Windows mobile 中 outlook 中任務,約會,聯系人,在調用時,有相應的database oid
對應的database oid 不是很清楚,我通過實驗,發現,任務是13, 約會是9, 聯系人是10.
那有沒有專門的數值對應呢?查了一下,發現這么個東東:
typedef /* [v1_enum] */
enum OlDefaultFolders
{ olFolderCalendar = 9,
olFolderContacts = 10,
olFolderTasks = 13,
olFolderCities = 101,
olFolderInfrared = 102,
} OlDefaultFolders;
和我們的實驗數據一樣.
不錯吧.
Why is everyone in such a rush?
Walk into any bookstore, and you'll see how to Teach Yourself Java in 7 Days alongside endless variations offering to teach Visual Basic, Windows, the Internet, and so on in a few days or hours. I did the following power search at Amazon.com:
pubdate: after 1992 and title: days and
(title: learn or title: teach yourself)
and got back 248 hits. The first 78 were computer books (number 79 was Learn Bengali in 30 days). I replaced "days" with "hours" and got remarkably similar results: 253 more books, with 77 computer books followed by Teach Yourself Grammar and Style in 24 Hours at number 78. Out of the top 200 total, 96% were computer books.
The conclusion is that either people are in a big rush to learn about computers, or that computers are somehow fabulously easier to learn than anything else. There are no books on how to learn Beethoven, or Quantum Physics, or even Dog Grooming in a few days.
Let's analyze what a title like Learn Pascal in Three Days could mean:
Learn: In 3 days you won't have time to write several significant programs, and learn from your successes and failures with them. You won't have time to work with an experienced programmer and understand what it is like to live in that environment. In short, you won't have time to learn much. So they can only be talking about a superficial familiarity, not a deep understanding. As Alexander Pope said, a little learning is a dangerous thing.
Pascal: In 3 days you might be able to learn the syntax of Pascal (if you already knew a similar language), but you couldn't learn much about how to use the syntax. In short, if you were, say, a Basic programmer, you could learn to write programs in the style of Basic using Pascal syntax, but you couldn't learn what Pascal is actually good (and bad) for. So what's the point? Alan Perlis once said: "A language that doesn't affect the way you think about programming, is not worth knowing". One possible point is that you have to learn a tiny bit of Pascal (or more likely, something like Visual Basic or javascript) because you need to interface with an existing tool to accomplish a specific task. But then you're not learning how to program; you're learning to accomplish that task.
in Three Days: Unfortunately, this is not enough, as the next section shows.
Teach Yourself Programming in Ten Years
Researchers (Hayes, Bloom) have shown it takes about ten years to develop expertise in any of a wide variety of areas, including chess playing, music composition, painting, piano playing, swimming, tennis, and research in neuropsychology and topology. There appear to be no real shortcuts: even Mozart, who was a musical prodigy at age 4, took 13 more years before he began to produce world-class music. In another genre, the Beatles seemed to burst onto the scene, appearing on the Ed Sullivan show in 1964. But they had been playing since 1957, and while they had mass appeal early on, their first great critical success, Sgt. Peppers, was released in 1967. Samuel Johnson thought it took longer than ten years: "Excellence in any department can be attained only by the labor of a lifetime; it is not to be purchased at a lesser price." And Chaucer complained "the lyf so short, the craft so long to lerne."
Here's my recipe for programming success:
Get interested in programming, and do some because it is fun. Make sure that it keeps being enough fun so that you will be willing to put in ten years.
Talk to other programmers; read other programs. This is more important than any book or training course.
Program. The best kind of learning is learning by doing. To put it more technically, "the maximal level of performance for individuals in a given domain is not attained automatically as a function of extended experience, but the level of performance can be increased even by highly experienced individuals as a result of deliberate efforts to improve." (p. 366) and "the most effective learning requires a well-defined task with an appropriate difficulty level for the particular individual, informative feedback, and opportunities for repetition and corrections of errors." (p. 20-21) The book Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life is an interesting reference for this viewpoint.
If you want, put in four years at a college (or more at a graduate school). This will give you access to some jobs that require credentials, and it will give you a deeper understanding of the field, but if you don't enjoy school, you can (with some dedication) get similar experience on the job. In any case, book learning alone won't be enough. "Computer science education cannot make anybody an expert programmer any more than studying brushes and pigment can make somebody an expert painter" says Eric Raymond, author of The New Hacker's Dictionary. One of the best programmers I ever hired had only a High School degree; he's produced a lot of great software, has his own news group, and through stock options is no doubt much richer than I'll ever be.
Work on projects with other programmers. Be the best programmer on some projects; be the worst on some others. When you're the best, you get to test your abilities to lead a project, and to inspire others with your vision. When you're the worst, you learn what the masters do, and you learn what they don't like to do (because they make you do it for them).
Work on projects after other programmers. Be involved in understanding a program written by someone else. See what it takes to understand and fix it when the original programmers are not around. Think about how to design your programs to make it easier for those who will maintain it after you.
Learn at least a half dozen programming languages. Include one language that supports class abstractions (like Java or C++), one that supports functional abstraction (like Lisp or ML), one that supports syntactic abstraction (like Lisp), one that supports declarative specifications (like Prolog or C++ templates), one that supports coroutines (like Icon or Scheme), and one that supports parallelism (like Sisal).
Remember that there is a "computer" in "computer science". Know how long it takes your computer to execute an instruction, fetch a word from memory (with and without a cache miss), read consecutive words from disk, and seek to a new location on disk. (Answers here.)
Get involved in a language standardization effort. It could be the ANSI C++ committee, or it could be deciding if your local coding style will have 2 or 4 space indentation levels. Either way, you learn about what other people like in a language, how deeply they feel so, and perhaps even a little about why they feel so.
Have the good sense to get off the language standardization effort as quickly as possible.
With all that in mind, its questionable how far you can get just by book learning. Before my first child was born, I read all the How To books, and still felt like a clueless novice. 30 Months later, when my second child was due, did I go back to the books for a refresher? No. Instead, I relied on my personal experience, which turned out to be far more useful and reassuring to me than the thousands of pages written by experts.
Fred Brooks, in his essay No Silver Bullets identified a three-part plan for finding great software designers:
Systematically identify top designers as early as possible.
Assign a career mentor to be responsible for the development of the prospect and carefully keep a career file.
Provide opportunities for growing designers to interact and stimulate each other.
This assumes that some people already have the qualities necessary for being a great designer; the job is to properly coax them along. Alan Perlis put it more succinctly: "Everyone can be taught to sculpt: Michelangelo would have had to be taught how not to. So it is with the great programmers".
So go ahead and buy that Java book; you'll probably get some use out of it. But you won't change your life, or your real overall expertise as a programmer in 24 hours, days, or even months.
References
Bloom, Benjamin (ed.) Developing Talent in Young People, Ballantine, 1985.
Brooks, Fred, No Silver Bullets, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.
Hayes, John R., Complete Problem Solver Lawrence Erlbaum, 1989.
Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988.
http://www.norvig.com/
最近在工作中遇到一個比較怪異的現象,在某些省區與SP的短信交互存在問題,短信發送不出去。查了一下原因:SmsSendMessage參數設置的問題。
在Windows Mobile 5.0SDK的HelloSMS例子中,發送短信的代碼是這樣寫的
這段代碼在一般情況下是運行正確的,對于手機與手機的發送是不存在問題的,但是與SP的交互在某些省區就存在短信發送不出去的情況。
為了更好的理解這段代碼,我們先來熟悉一下SmsSendMessage及各個參數。
SmsSendMessage
功能:Use the SmsSendMessage function to create and send an Short Message Service (SMS) message.(創建和發送短信,但短信發送后并不保存到發件箱中)
原型:
HRESULT SmsSendMessage (
const SMS_HANDLE smshHandle, // 調用SmsOpen時獲得的短信句柄
const SMS_ADDRESS * const psmsaSMSCAddress, //指向短信中心號碼的地址
const SMS_ADDRESS * const psmsaDestinationAddress, // 發送的目的地址
const SYSTEMTIME * const pstValidityPeriod, // 發送時間的有效期
const BYTE * const pbData, // 信息的內容部分
const DWORD dwDataSize,// 信息內容的長度
const BYTE * const pbProviderSpecificData, //運營商的附加數據
const DWORD dwProviderSpecificDataSize, // 附加數據的長度
const SMS_DATA_ENCODING smsdeDataEncoding, // 短信編碼
const DWORD dwOptions, // 其他選項
SMS_MESSAGE_ID * psmsmidMessageID); // 用于得到系統回執的信息
(具體介紹可查看http://msdn.microsoft.com/en-us/library/aa455068.aspx)
在實際應用中短信發送不出去,但是SmsSendMessage的返回值是S_OK值。在一些文章中有人這樣認為是短信編碼的問題造成的。
如果編碼格式不對可能造成短信中心網關把短信給吞掉的情況,程序雖然調用成功,但是就是目標號碼收不到短信。函數參數中的后三個參數可以不用或設默認值都可以。
起初我也是認為這個地方造成的,很是興奮。短信的回復內容恰為字母,我誤以為短信內容此時是7-BIT的短消息,短信網關把短信給吞掉了,造成目標號碼收不到短信。在練習中卻也陰差陽錯的成功了。很高興的把理由歸到了這個地方。并這樣總結:SmsSendMessage可以支持7-bit的ASCII碼的短消息,也支持16-bit的unicode的短消息。但內容為ASCII的時候,短信編碼為 SMSDE_GSM或SMSDE_OPTIMAL,當內容不全是ASCII的時候,短信編碼為SMSDE_GSM或SMSDE_OPTIMAL。所以回復內容改為漢字即可。
但是這樣對么?起初我認為我的解釋很合理.但是我卻發現我的一個參數與原來的程序不一樣.
是我在嘗試中無意修改了一個參數,將
tpsd.psMessageClass = PS_MESSAGE_CLASS1;
修改為了
tpsd.psMessageClass = PS_MESSAGE_CLASSUNSPECIFIED;
這是發送短信中的運營商的指定數據TEXT_PROVIDER_SPECIFIC_DATA,它的參數psMessageClass是指
Text Short Message Service (SMS) messages with the appropriate flag can replace previously received notifications with a similar flag and originating address.
它有以下五個值:
PS_MESSAGE_CLASS0: The message should be displayed immediately but not stored. The MS shall send an acknowledgement to the service center when the message has successfully reached the MS. (被接受后立即顯示但不存儲(稱為閃信)。需要向SMSC發送確認信息。)
PS_MESSAGE_CLASS1:The message should be stored and an acknowledgement should be sent to the
PS_MESSAGE_CLASS2:The message should be transferred to the SMS data field in the subscriber identity module (SIM) before an acknowledgement is sent to the
PS_MESSAGE_CLASS3:When the message has successfully reached the destination and can be stored, an acknowledgement is sent to the
PS_MESSAGE_CLASSUNSPECIFIED:The message Class is not set in the outgoing or incoming message. (對發出或收到的短信不進行設置)
分析以上五個值,前四個值有一個共同的特點,都需要向SMSC發送確認。而最后一個值沒有設定。
這個值的改動,解決了我所遇到的問題。但究其原因,我有些想不通為什么?
但是在實際應用中,出現了tmail.exe的異常。不知道是這個值的變動帶來的問題,還是實際模塊中存在的問題。還需要繼續研究一下。
如果大家有知道的,給些建議哈.
前階段在調研mobile上的內存釋放問題,根據大家的建議嘗試了一些,但是沒有什么效果。
于是跑到MSDN上去問相關的問題,得到了一些解答。
As far as I know, I don't think there is other way to meet your requirement. Since each mobile application has 32M memory limitation, we have to do the performance manually, like deleting object which is not used and allocating Large Memory Blocks in Large memory Area.
For more information:
Windows CE .NET Advanced Memory Management
How the Windows Mobile 5.0 Shell Handles Low Memory Situations
我看了一部分,在How the Windows Mobile 5.0 Shell Handles Low Memory Situations中提到,
Hibernate
This is the amount of memory the shell tries to keep free at all times. If the amount of free memory falls below this value then the low memory check routine will try to free up memory. It will do this by first sending WM_HIBERNATE to all valid applications. When an application receives this message it should try to free as many resources as possible. When the low memory check routine runs again and the amount of free memory is still below the hibernate level then the shell will try to close the least recently used (LRU) application by sending a WM_CLOSE message. If the low memory check routine runs yet again and the amount of free memory is still below the hibernate level then the shell will call TerminateProcess on the LRU application that it last sent the WM_CLOSE message to.
我對這段話的理解是:當空閑內存小于Hibernate時,系統便會嘗試釋放內存。首先他會向所有有效的程序發送WM_HIBERNATE。應用程序收到該消息后,會盡量釋放資源來釋放內存。如果還低于這個值的話,將發送WM_CLOSE消息給最近很少使用的程序。如果還低于該值的,就強行關閉該程序了。
這個方法似乎有效,但是用戶再起來程序的話,還是一樣的效果,并不是達到了什么釋放內存的效果。如何記錄最近很少使用的程序,這個是不是有什么方法獲得呢?
就可以像系統提示的那樣,內存不足,請釋放一些內存。手工做一些比較好。
也看了一些相近的程序的做法,似乎效果也沒有大家說的那么好。
在How the Windows Mobile 5.0 Shell Handles Low Memory Situations的最后,這樣寫的
What can my Application do?
The best thing your application can do when faced with a low memory situation is to play nicely with the rest of the device.
1、If your application receives a WM_HIBERNATE message free up any resources not absolutely required.
2、If you are planning on allocating a large amount of memory (or if a large allocation fails) you should call SHCloseApps, which will invoke the shell low memory check routine and will try to ensure that enough free memory exists. See below for an example: