<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4102114367534237129</id><updated>2011-12-24T04:05:47.474-08:00</updated><title type='text'>nono理想</title><subtitle type='html'>人活着到底怎么算是快乐！！
何为理想！！</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>90</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-463930600331080399</id><published>2010-04-30T03:18:00.000-07:00</published><updated>2010-04-30T03:19:35.220-07:00</updated><title type='text'>TextAlertView</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fAv06gZ6FPU/S9qur89XatI/AAAAAAAAAJo/uctp23-5UmM/s1600/6_491_5836b921d98a411.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 310px; height: 400px;" src="http://3.bp.blogspot.com/_fAv06gZ6FPU/S9qur89XatI/AAAAAAAAAJo/uctp23-5UmM/s400/6_491_5836b921d98a411.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5465873167888640722" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#import &lt;UIKit/UIKit.h&gt;&lt;br /&gt;&lt;br /&gt;#define kUITextFieldHeight 30.0&lt;br /&gt;#define kUITextFieldXPadding 12.0&lt;br /&gt;#define kUITextFieldYPadding 10.0&lt;br /&gt;#define kUIAlertOffset 100.0&lt;br /&gt;&lt;br /&gt;@interface TextAlertView : UIAlertView {&lt;br /&gt; UITextField *textField;&lt;br /&gt; BOOL layoutDone;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@property (nonatomic, retain) UITextField *textField;&lt;br /&gt;&lt;br /&gt;- (id)initWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegate &lt;br /&gt;  cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ...;&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#import "TextAlertView.h"&lt;br /&gt;&lt;br /&gt;@implementation TextAlertView&lt;br /&gt;&lt;br /&gt;@synthesize textField;&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt; * Initialize view with maximum of two buttons&lt;br /&gt; */&lt;br /&gt;- (id)initWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegate &lt;br /&gt;  cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ... {&lt;br /&gt; self = [super initWithTitle:title message:message delegate:delegate cancelButtonTitle:cancelButtonTitle&lt;br /&gt;     otherButtonTitles:otherButtonTitles, nil];&lt;br /&gt; if (self) {&lt;br /&gt;  // Create and add UITextField to UIAlertView&lt;br /&gt;  UITextField *myTextField = [[[UITextField alloc] initWithFrame:CGRectZero] retain];&lt;br /&gt;  myTextField.autocorrectionType = UITextAutocorrectionTypeNo;&lt;br /&gt;  myTextField.alpha = 0.75;&lt;br /&gt;  myTextField.borderStyle = UITextBorderStyleRoundedRect;&lt;br /&gt;  myTextField.delegate = delegate;&lt;br /&gt;  [self setTextField:myTextField];&lt;br /&gt;  // insert UITextField before first button&lt;br /&gt;  BOOL inserted = NO;&lt;br /&gt;  for( UIView *view in self.subviews ){&lt;br /&gt;   if(!inserted &amp;&amp; ![view isKindOfClass:[UILabel class]])&lt;br /&gt;    [self insertSubview:myTextField aboveSubview:view];&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  //[self addSubview:myTextField];&lt;br /&gt;  // ensure that layout for views is done once&lt;br /&gt;  layoutDone = NO;&lt;br /&gt;  &lt;br /&gt;  // add a transform to move the UIAlertView above the keyboard&lt;br /&gt;  CGAffineTransform myTransform = CGAffineTransformMakeTranslation(0.0, kUIAlertOffset);&lt;br /&gt;  [self setTransform:myTransform];&lt;br /&gt; }&lt;br /&gt; return self;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt; * Show alert view and make keyboard visible&lt;br /&gt; */&lt;br /&gt;- (void) show {&lt;br /&gt; [super show];&lt;br /&gt; [[self textField] becomeFirstResponder];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt; * Determine maximum y-coordinate of UILabel objects. This method assumes that only&lt;br /&gt; * following objects are contained in subview list:&lt;br /&gt; * - UILabel&lt;br /&gt; * - UITextField&lt;br /&gt; * - UIThreePartButton (Private Class)&lt;br /&gt; */&lt;br /&gt;- (CGFloat) maxLabelYCoordinate {&lt;br /&gt; // Determine maximum y-coordinate of labels&lt;br /&gt; CGFloat maxY = 0;&lt;br /&gt; for( UIView *view in self.subviews ){&lt;br /&gt;  if([view isKindOfClass:[UILabel class]]) {&lt;br /&gt;   CGRect viewFrame = [view frame];&lt;br /&gt;   CGFloat lowerY = viewFrame.origin.y + viewFrame.size.height;&lt;br /&gt;   if(lowerY &gt; maxY)&lt;br /&gt;    maxY = lowerY;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; return maxY;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt; * Override layoutSubviews to correctly handle the UITextField&lt;br /&gt; */&lt;br /&gt;- (void)layoutSubviews {&lt;br /&gt; [super layoutSubviews];&lt;br /&gt; CGRect frame = [self frame];&lt;br /&gt; CGFloat alertWidth = frame.size.width;&lt;br /&gt; &lt;br /&gt; // Perform layout of subviews just once&lt;br /&gt; if(!layoutDone) {&lt;br /&gt;  CGFloat labelMaxY = [self maxLabelYCoordinate];&lt;br /&gt;  &lt;br /&gt;  // Insert UITextField below labels and move other fields down accordingly&lt;br /&gt;  for(UIView *view in self.subviews){&lt;br /&gt;      if([view isKindOfClass:[UITextField class]]){&lt;br /&gt;    CGRect viewFrame = CGRectMake(&lt;br /&gt;             kUITextFieldXPadding, &lt;br /&gt;             labelMaxY + kUITextFieldYPadding, &lt;br /&gt;             alertWidth - 2.0*kUITextFieldXPadding, &lt;br /&gt;             kUITextFieldHeight);&lt;br /&gt;    [view setFrame:viewFrame];&lt;br /&gt;      } else if(![view isKindOfClass:[UILabel class]]) {&lt;br /&gt;    CGRect viewFrame = [view frame];&lt;br /&gt;    viewFrame.origin.y += kUITextFieldHeight;&lt;br /&gt;    [view setFrame:viewFrame];&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  // size UIAlertView frame by height of UITextField&lt;br /&gt;  frame.size.height += kUITextFieldHeight + 2.0;&lt;br /&gt;  [self setFrame:frame];&lt;br /&gt;  layoutDone = YES;&lt;br /&gt; } else {&lt;br /&gt;  // reduce the x placement and width of the UITextField based on UIAlertView width&lt;br /&gt;  for(UIView *view in self.subviews){&lt;br /&gt;      if([view isKindOfClass:[UITextField class]]){&lt;br /&gt;    CGRect viewFrame = [view frame];&lt;br /&gt;    viewFrame.origin.x = kUITextFieldXPadding;&lt;br /&gt;    viewFrame.size.width = alertWidth - 2.0*kUITextFieldXPadding;&lt;br /&gt;    [view setFrame:viewFrame];&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-463930600331080399?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/463930600331080399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/04/textalertview.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/463930600331080399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/463930600331080399'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/04/textalertview.html' title='TextAlertView'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_fAv06gZ6FPU/S9qur89XatI/AAAAAAAAAJo/uctp23-5UmM/s72-c/6_491_5836b921d98a411.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-5112288140819994429</id><published>2010-04-28T09:07:00.000-07:00</published><updated>2010-04-28T09:09:04.865-07:00</updated><title type='text'>Avoiding iPhone App Rejection From Apple</title><content type='html'>FROM http://www.mobileorchard.com/avoiding-iphone-app-rejection-from-apple/&lt;br /&gt;&lt;br /&gt;I’ve been developing apps for the iPhone for over 6 months now. Over this time period, I’ve successfully submitted over 45 apps, the majority under my own company’s iTunes account. Given the large number of app submissions, I’ve had my share of app rejections.&lt;br /&gt;&lt;br /&gt;As has been mentioned many many times on the various developer forums, Apple’s approval process can be very frustrating and inconsistent. However, if you are careful, you can greatly reduce your risk of getting an app rejected.&lt;br /&gt;&lt;br /&gt;Based on my own experiences, here’s my list of things to be careful about:&lt;br /&gt;&lt;br /&gt;1. The dreaded HIG Violation of Apple’s Human Interface Guidelines (HIG) is probably the most frequent cause for an app to be rejected. As an iPhone developer, you definitely need to read the HIG and follow the guidelines! Take every single item mentioned in the HIG seriously. Yes, many apps demonstrate gross violations of the HIG (after all, splash screens are a no-no according to the HIG), but you can never claim “App X does this and is already in the store” as an excuse when Apple rejects your app. Well, you can claim that, but Apple will not accept it as a valid justification.&lt;br /&gt;&lt;br /&gt;There are certain items in the HIG to which Apple does seem to turn a blind eye (splash screens probably being the most obvious), but unless you like taking chances with your livelihood, avoid going against any of the HIG guidelines.&lt;br /&gt;&lt;br /&gt;2. Matching icons Believe it or not, Apple is now requiring the 512×512 iTunes Store icon match the 57×57 icon displayed on the iPhone. As a reason for rejection, Apple will state having unmatching icons is in violation of the HIG. There’s nothing in the HIG that states these two icons must match, but since it’s Apple’s store, you basically need to play by their arbitrary rules. So, unless you want unnecessary delays in your approval, make sure your icons match. The icons don’t have to be identical, but there should be something shared between the two. Just having them both be pictures that are of a similar theme is not enough.&lt;br /&gt;&lt;br /&gt;3. Simulating failures Apple doesn’t like anything that pretends the iPhone or iPod Touch is failing. So, simulating a cracked screen is a good way to get your app rejected. Any other idea of faking a failure of the iPhone which you might think others would find amusing will probably also be a reason for rejection from Apple.&lt;br /&gt;&lt;br /&gt;4. Button images must be consistent If you decide to use one of the existing images Apple provides for buttons, be careful you use it for an identical function. While the HIG states you can use a standard button in a non-standard way if your app is providing a “immersive environment”, you are better off creating your own custom buttons to avoid the risk of rejection. If you use the “action button” image, make sure tapping on it brings up a menu with choices. If it doesn’t, Apple may reject the app.&lt;br /&gt;&lt;br /&gt;5. Bandwidth usage over cellular networks If your app downloads data over the cellular network, ensure you do not use too much bandwidth. How much is too much? Well, there isn’t an exact number, but a tech support person from Apple advised me to not exceed 4.5 meg of data per 5 minutes of activity. You can test your app’s usage by going into your iPhone settings, choosing the General-&gt;Usage menu and clearing the stats. Then run your app for 5 minutes, return to this screen and see what the stats say. Also, to get the most accurate numbers, you should turn off any other network activity on your phone while you run the test (such as Email or MobileMe updates).&lt;br /&gt;&lt;br /&gt;6. Popup for network detection If your app requires the use of the Internet, you must detect when the network is unavailable and provide a pop-up message informing the user. Just having the spinning busy icon display and a message saying “trying to connect” is not sufficient. Apple will reject your app if you don’t provide a message informing the user that they need a network connection.&lt;br /&gt;&lt;br /&gt;7. False claims of a missing network On a related note, make sure you don’t have any false positives in your network detection. There’s a bug in the “reachability” functions provided by Apple. If you don’t first try to perform a network connection but instead just do a reachability test, the code will always report the network is unavailable. Apple will reject your app if they discover you have this false positive case.&lt;br /&gt;&lt;br /&gt;8. Political lampooning Don’t make any jokes about political figures, past or present, in either your app or the description in iTunes. Apple will most-likely reject your app.&lt;br /&gt;&lt;br /&gt;9. Ensure your app description is accurate Spend some time proof-reading your app description for iTunes. This description is the only information the reviewer is going to have about your app. Make sure there isn’t anything ambiguous in the description. If there is room for misunderstanding a feature, you run the risk of the reviewer rejecting the app because they felt the app does not behave as described.&lt;br /&gt;&lt;br /&gt;10. Keep your “what’s new” descriptions brief Whenever you submit an update, Apple requires you to provide a description of what is new in the app. Related to the previous note above, try to be as clear and concise as possible. Don’t go into too much detail describing what has changed, otherwise you introduce more opportunity for the reviewer to misunderstand what has changed. I’ve had an app rejected because the reviewer misunderstood what I said had changed in the app.&lt;br /&gt;&lt;br /&gt;11. OS compatibility If you claim your app works with OS 2.0 and higher, you better make sure you test whether your app really does work on all the OS versions between 2.0 and the current one. The reviewer most-likely will! There are some anomalies in the behavior of certain functions across the different versions of the OS (for example, reachability code returns a slightly different set of flags under 2.0 vs. 2.2, UILabels don’t respond to the Touch events under 2.1 and earlier, etc.). If the reviewer finds the app does not work properly with a certain version of the OS, the app will rightly be rejected. However, don’t expect the reviewer to mention that they were testing using a different OS. That little detail is usually not mentioned in the rejection email, leading to the potential for lost time trying to find a bug while testing with a different OS than the reviewer. Again, test the app with every version you claim to support.&lt;br /&gt;&lt;br /&gt;This is by no means an exhaustive list. It’s just the things I’ve personally run into in my app submissions and is a laundry list of items I keep in the back of my mind whenever I’m developing a new app.&lt;br /&gt;&lt;br /&gt;If you do find your app is rejected, the best advice I can give is try to remain calm. Remember there are thousands of other developers in your shoes. We feel your pain. It often feels unfair, and perhaps it is unfair at times. It can be a terribly frustrating experience, especially when you’ve done your best to follow every guideline Apple provides and you might be convinced Apple is wrong in their assessment of your app.&lt;br /&gt;&lt;br /&gt;But, it’s Apple’s store. They can do whatever they want in the end and don’t have to be fair. If you feel your app has been wrongfully rejected, the best you can do is be courteous and try to outline your position, quoting from whatever relevant Apple documentation applies. But, in the end, don’t expect Apple to yield to your request, or in many cases, even acknowledge your request. Apple is generally very brief in their email responses and sometimes totally silent. The best bet for an approval is to implement a change based on Apple’s reason for rejection and move on. Trying to win an argument because you feel you are right is not going to be productive.&lt;br /&gt;&lt;br /&gt;And if you do get a rejection, add it to your list of things to avoid for the next app.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Six weeks ago guest author Brian Stormont posted an article here titled Avoiding iPhone App Rejection From Apple. While writing a rejection story is almost a rite of passage amongst iPhone developers, Brian took a prescriptive what not to do angle.&lt;br /&gt;&lt;br /&gt;Brian’s story elicited a big response. Dozens of people contributed comments and wrote privately to supply additional gotchas, tips and approaches. While some weren’t helpful — e.g., “Be Trent Reznor,” in reference to the rejection then approval, unchanged, of the Nine Inch Nails app — many were.&lt;br /&gt;&lt;br /&gt;We’ve collated, consolidated, summarized and (except when the authors asked us not to) attributed the collective wisdom to present it to you here:&lt;br /&gt;&lt;br /&gt;1. Trademarks, Particularly Icons — Numerous apps, including Bump, the Billionth App ran into delays and rejections for including icons and imagery that a Apple deemed a trademark violation. Common culprits: iPhone-like icons and Polaroid-like image frames.&lt;br /&gt;&lt;br /&gt;2. Giveaways/Prize Apps/Contests — While not expressly forbidden in the contracts, Apple rejects prize applications and apps that contains contests or giveaways. There are exceptions to this policy. For example, Apple seems willing to let game applications tie into an on-the-web leaderboard with prizes, though an in-app/embedded leaderboard with prizes is likely verboten. However, as the policy is either unwritten or unavailable for review outside of Apple, trying to create an app that narrowly fits within the inferred acceptable parameters or operates similarly to existing giveaway apps already in the store is risky.&lt;br /&gt;&lt;br /&gt;3. Don’t Ask, Don’t Tell — Sometimes being above-board doesn’t pay. An example: Alan Francis wrote to tell us about his experience submitting an app that included the Pinch Analytics, an package used in thousands of apps that collects anonymized usage data. As a courtesy to his users, Alan stated that he was collecting this data and provided an opt-out mechanism. Either one of these measures is unusual; combined, almost unheard of. His app was rejected until he added a giant warning label on first run, while thousands of other applications that failed to mention including analytics were allowed in.&lt;br /&gt;&lt;br /&gt;4. Avoid Humor Where It’s Not Expected, Or Where It Violates The HIG —&lt;br /&gt;An update to the Instant New York app was rejected when its developers jokingly included the phrase “extra dragons” in their release notes — though, as noted by Jeff Richardson, Apple did approve an update to Google’s app with release notes containing “longer version number” and “ninja.” Carl HerrMann’s intentionally silly BellyButton app was rejected for a disabled “lint” button, the HIG violating joke being that nobody would want link in their bellybutton.&lt;br /&gt;&lt;br /&gt;5. Inadvertent “Objectionable Content” — Last week, the story of the rejection and then later approval of Eucalyptus — a library app featuring over 20,000 classic books — was widely reported upon. The app sourced freely available content from Project Gutenberg. Buried in the archives was a Victorian, text-only translation of the Kama Sutra of Vatsyayana. Apple rejected the app on “objectionable content” grounds. Its author, after first trying to resolve the issue with Apple, blogged about his experience whence it was picked up widely. Shortly thereafter Apple reversed its decision. Eucalyptus was the latest in a series; previous examples: Tweetie, the popular Twitter client, rejected because people swear on Twitter; Jesse Tayler’s Craig’s List Browser because, well, take your pick — it’s Craig’s list!; and Jelle Prins’s Lyrics because not all songs are PG. Wired’s story about Jelle adding a dirty-word filter, and the easter egg to disable it, is worth reading.&lt;br /&gt;&lt;br /&gt;6. Update Spam — There’s some indication that Apple frowns upon publishing no-change updates in an attempt to keep your app appearing in the what’s new listings. Noel Llopis provided a humorous example: “I submitted an update for Tea Time. The update was just a bug fix with the images in the picker, so in the what’s new field I wrote. ‘Fixed a bug that would occasionally display the wrong image for a tea type.’ Apple rejected the update a week later saying that they ‘tried it, but the image never changed for different tea types’. I was totally baffled until I realized they were testing the countdown screen, which has a static image of a tea cup, not the images on the picker. So I had to resubmit the same binary adding ‘in the picker’ to the what’s new description.”&lt;br /&gt;&lt;br /&gt;7. Doesn’t Work. Doesn’t Work As Advertised — Reportedly, the most common reason for rejecting an app is that it simply doesn’t work or doesn’t work as advertised. Seems obvious, and I wouldn’t have bothered to report it if it wasn’t apparently so common.&lt;br /&gt;&lt;br /&gt;8. Public Figures — Brian’s original article included “political lampooning.” I’ll extend that to include association or portrayal of public figures. Two examples: around Obama’s inauguration, CodeMorphic created an app called Obamify that manipulated photos to appear like those iconic posters from the campaign; the app went into infinite review. Yak Apps had to remove imagery containing Mr. and Mrs. Obama before their “First Dog” app was approved.&lt;br /&gt;&lt;br /&gt;9. Too Few Potential Consumers (Or The Appearance Thereof) — Memo Akten produced remote control software that conforms to the TUIO protocol for sending multi-touch events over WiFi. Apple rejected it on grounds that its market was too small and suggested, instead, Ad Hoc Distribution. I spent 10 minutes trying to figure out how small this niche is and was ready to write it off until I discovered that this field is connected (conceptually, at least) to Microsoft’s Surface technology and is covered by the analyst firm IDG. Would an overtaxed app reviewer at Apple spend the time to make this determination? Best bet is to save them the work by supplying them with evidence in your submission has a vast, mainstream audience — or at least a sizable niche one.&lt;br /&gt;&lt;br /&gt;Updated: 10. Don’t Include Price In Your Description — Just minutes after I originally posted this article Michael Kaye added a very good additional tip: “Don’t mention pricing in the App Description. For example mentioning ‘now only $1.99′ will according to Apple, ‘potentially confuse users’…and they have a point as its 99 pence in the UK, €1.99 in Europe etc.” Thanks for the great comment Michael!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-5112288140819994429?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/5112288140819994429/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/04/avoiding-iphone-app-rejection-from.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5112288140819994429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5112288140819994429'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/04/avoiding-iphone-app-rejection-from.html' title='Avoiding iPhone App Rejection From Apple'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-4294528185457076004</id><published>2010-04-26T09:14:00.001-07:00</published><updated>2010-04-26T09:14:30.124-07:00</updated><title type='text'>NSString's skill</title><content type='html'>[[devToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"&lt;&gt;"]]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-4294528185457076004?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/4294528185457076004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/04/nsstrings-skill.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/4294528185457076004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/4294528185457076004'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/04/nsstrings-skill.html' title='NSString&apos;s skill'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-595778596724920797</id><published>2010-04-26T03:24:00.001-07:00</published><updated>2010-04-26T03:24:40.624-07:00</updated><title type='text'>Bubble_Sort</title><content type='html'>- (void)bubble_sort {&lt;br /&gt; int i = [finalRouteList count]-1;&lt;br /&gt; bool change = true;&lt;br /&gt; &lt;br /&gt; for (; i&gt;=1&amp;&amp;change; --i) {&lt;br /&gt;  change = false;&lt;br /&gt;  for (int j = 0; j&lt;i; ++j) {&lt;br /&gt;   Route *myRoute1 = [finalRouteList objectAtIndex:j];&lt;br /&gt;   Route *myRoute2 = [finalRouteList objectAtIndex:j+1];&lt;br /&gt;   AvegoAppDelegate *delegate = (AvegoAppDelegate *)[[UIApplication sharedApplication] delegate];&lt;br /&gt;   if ((pow([myRoute1.fromLat doubleValue]-delegate.locationManager.location.coordinate.latitude, 2)+pow([myRoute1.fromLon doubleValue]-delegate.locationManager.location.coordinate.longitude, 2))&gt;(pow([myRoute2.fromLat doubleValue]-delegate.locationManager.location.coordinate.latitude, 2)+pow([myRoute2.fromLon doubleValue]-delegate.locationManager.location.coordinate.longitude, 2))){&lt;br /&gt;    [finalRouteList exchangeObjectAtIndex:j withObjectAtIndex:j+1];&lt;br /&gt;    change = true;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-595778596724920797?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/595778596724920797/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/04/bubblesort.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/595778596724920797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/595778596724920797'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/04/bubblesort.html' title='Bubble_Sort'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-3081320346883770771</id><published>2010-04-23T12:11:00.000-07:00</published><updated>2010-04-23T12:12:09.319-07:00</updated><title type='text'>10 secs hidden</title><content type='html'>CGContextRef context = UIGraphicsGetCurrentContext();&lt;br /&gt;            [UIView beginAnimations:nil context:context];&lt;br /&gt;            [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];&lt;br /&gt;            [UIView setAnimationDuration:0.3];&lt;br /&gt;            [ToolBar setAlpha:1.0];&lt;br /&gt;            [UIView commitAnimations];    &lt;br /&gt;            [self performSelector:@selector(Hidden) withObject:nil afterDelay:1.0];&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-(void)Hidden{&lt;br /&gt;    CGContextRef context = UIGraphicsGetCurrentContext();&lt;br /&gt;    [UIView beginAnimations:nil context:context];&lt;br /&gt;    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];&lt;br /&gt;    [ToolBar setAlpha:0.0];&lt;br /&gt;    [UIView setAnimationDuration:0.3];&lt;br /&gt;    [UIView commitAnimations];    &lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-3081320346883770771?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/3081320346883770771/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/04/10-secs-hidden.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/3081320346883770771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/3081320346883770771'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/04/10-secs-hidden.html' title='10 secs hidden'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-7451863100531094877</id><published>2010-04-07T02:22:00.000-07:00</published><updated>2010-04-07T02:24:55.704-07:00</updated><title type='text'>NSDataAdditions ： 64Encoding...</title><content type='html'>&lt;pre&gt;&lt;br /&gt;@interface NSData (NSDataAdditions)&lt;br /&gt;+ (NSData *) dataWithBase64EncodedString:(NSString *) string;&lt;br /&gt;- (id) initWithBase64EncodedString:(NSString *) string;&lt;br /&gt;&lt;br /&gt;- (NSString *) base64Encoding;&lt;br /&gt;- (NSString *) base64EncodingWithLineLength:(unsigned int) lineLength;&lt;br /&gt;&lt;br /&gt;- (BOOL) hasPrefix:(NSData *) prefix;&lt;br /&gt;- (BOOL) hasPrefixBytes:(void *) prefix length:(unsigned int) length;&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;// Created by khammond on Mon Oct 29 2001.&lt;br /&gt;// Formatted by Timothy Hatcher on Sun Jul 4 2004.&lt;br /&gt;// Copyright (c) 2001 Kyle Hammond. All rights reserved.&lt;br /&gt;// Original development by Dave Winer.&lt;br /&gt;&lt;br /&gt;#import "NSDataAdditions.h"&lt;br /&gt;&lt;br /&gt;static char encodingTable[64] = {&lt;br /&gt;  'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',&lt;br /&gt;  'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',&lt;br /&gt;  'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',&lt;br /&gt;  'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/' };&lt;br /&gt;&lt;br /&gt;@implementation NSData (NSDataAdditions)&lt;br /&gt;+ (NSData *) dataWithBase64EncodedString:(NSString *) string {&lt;br /&gt; return [[[NSData allocWithZone:nil] initWithBase64EncodedString:string] autorelease];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (id) initWithBase64EncodedString:(NSString *) string {&lt;br /&gt; NSMutableData *mutableData = nil;&lt;br /&gt;&lt;br /&gt; if( string ) {&lt;br /&gt;  unsigned long ixtext = 0;&lt;br /&gt;  unsigned long lentext = 0;&lt;br /&gt;  unsigned char ch = 0;&lt;br /&gt;  unsigned char inbuf[4], outbuf[3];&lt;br /&gt;  short i = 0, ixinbuf = 0;&lt;br /&gt;  BOOL flignore = NO;&lt;br /&gt;  BOOL flendtext = NO;&lt;br /&gt;  NSData *base64Data = nil;&lt;br /&gt;  const unsigned char *base64Bytes = nil;&lt;br /&gt;&lt;br /&gt;  // Convert the string to ASCII data.&lt;br /&gt;  base64Data = [string dataUsingEncoding:NSASCIIStringEncoding];&lt;br /&gt;  base64Bytes = (const unsigned char *)[base64Data bytes];&lt;br /&gt;  mutableData = [NSMutableData dataWithCapacity:[base64Data length]];&lt;br /&gt;  lentext = [base64Data length];&lt;br /&gt;&lt;br /&gt;  while( YES ) {&lt;br /&gt;   if( ixtext &gt;= lentext ) break;&lt;br /&gt;   ch = base64Bytes[ixtext++];&lt;br /&gt;   flignore = NO;&lt;br /&gt;&lt;br /&gt;   if( ( ch &gt;= 'A' ) &amp;&amp; ( ch &lt;= 'Z' ) ) ch = ch - 'A';&lt;br /&gt;   else if( ( ch &gt;= 'a' ) &amp;&amp; ( ch &lt;= 'z' ) ) ch = ch - 'a' + 26;&lt;br /&gt;   else if( ( ch &gt;= '0' ) &amp;&amp; ( ch &lt;= '9' ) ) ch = ch - '0' + 52;&lt;br /&gt;   else if( ch == '+' ) ch = 62;&lt;br /&gt;   else if( ch == '=' ) flendtext = YES;&lt;br /&gt;   else if( ch == '/' ) ch = 63;&lt;br /&gt;   else flignore = YES;&lt;br /&gt;&lt;br /&gt;   if( ! flignore ) {&lt;br /&gt;    short ctcharsinbuf = 3;&lt;br /&gt;    BOOL flbreak = NO;&lt;br /&gt;&lt;br /&gt;    if( flendtext ) {&lt;br /&gt;     if( ! ixinbuf ) break;&lt;br /&gt;     if( ( ixinbuf == 1 ) || ( ixinbuf == 2 ) ) ctcharsinbuf = 1;&lt;br /&gt;     else ctcharsinbuf = 2;&lt;br /&gt;     ixinbuf = 3;&lt;br /&gt;     flbreak = YES;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    inbuf [ixinbuf++] = ch;&lt;br /&gt;&lt;br /&gt;    if( ixinbuf == 4 ) {&lt;br /&gt;     ixinbuf = 0;&lt;br /&gt;     outbuf [0] = ( inbuf[0] &lt;&lt; 2 ) | ( ( inbuf[1] &amp; 0x30) &gt;&gt; 4 );&lt;br /&gt;     outbuf [1] = ( ( inbuf[1] &amp; 0x0F ) &lt;&lt; 4 ) | ( ( inbuf[2] &amp; 0x3C ) &gt;&gt; 2 );&lt;br /&gt;     outbuf [2] = ( ( inbuf[2] &amp; 0x03 ) &lt;&lt; 6 ) | ( inbuf[3] &amp; 0x3F );&lt;br /&gt;&lt;br /&gt;     for( i = 0; i &lt; ctcharsinbuf; i++ )&lt;br /&gt;      [mutableData appendBytes:&amp;outbuf[i] length:1];&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if( flbreak )  break;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; self = [self initWithData:mutableData];&lt;br /&gt; return self;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#pragma mark -&lt;br /&gt;&lt;br /&gt;- (NSString *) base64Encoding {&lt;br /&gt; return [self base64EncodingWithLineLength:0];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (NSString *) base64EncodingWithLineLength:(unsigned int) lineLength {&lt;br /&gt; const unsigned char *bytes = (const unsigned char *)[self bytes];&lt;br /&gt; NSMutableString *result = [NSMutableString stringWithCapacity:[self length]];&lt;br /&gt; unsigned long ixtext = 0;&lt;br /&gt; unsigned long lentext = [self length];&lt;br /&gt; long ctremaining = 0;&lt;br /&gt; unsigned char inbuf[3], outbuf[4];&lt;br /&gt; unsigned short i = 0;&lt;br /&gt; unsigned short charsonline = 0, ctcopy = 0;&lt;br /&gt; unsigned long ix = 0;&lt;br /&gt;&lt;br /&gt; while( YES ) {&lt;br /&gt;  ctremaining = lentext - ixtext;&lt;br /&gt;  if( ctremaining &lt;= 0 ) break;&lt;br /&gt;&lt;br /&gt;  for( i = 0; i &lt; 3; i++ ) {&lt;br /&gt;   ix = ixtext + i;&lt;br /&gt;   if( ix &lt; lentext ) inbuf[i] = bytes[ix];&lt;br /&gt;   else inbuf [i] = 0;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  outbuf [0] = (inbuf [0] &amp; 0xFC) &gt;&gt; 2;&lt;br /&gt;  outbuf [1] = ((inbuf [0] &amp; 0x03) &lt;&lt; 4) | ((inbuf [1] &amp; 0xF0) &gt;&gt; 4);&lt;br /&gt;  outbuf [2] = ((inbuf [1] &amp; 0x0F) &lt;&lt; 2) | ((inbuf [2] &amp; 0xC0) &gt;&gt; 6);&lt;br /&gt;  outbuf [3] = inbuf [2] &amp; 0x3F;&lt;br /&gt;  ctcopy = 4;&lt;br /&gt;&lt;br /&gt;  switch( ctremaining ) {&lt;br /&gt;  case 1:&lt;br /&gt;   ctcopy = 2;&lt;br /&gt;   break;&lt;br /&gt;  case 2:&lt;br /&gt;   ctcopy = 3;&lt;br /&gt;   break;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  for( i = 0; i &lt; ctcopy; i++ )&lt;br /&gt;   [result appendFormat:@"%c", encodingTable[outbuf[i]]];&lt;br /&gt;&lt;br /&gt;  for( i = ctcopy; i &lt; 4; i++ )&lt;br /&gt;   [result appendString:@"="];&lt;br /&gt;&lt;br /&gt;  ixtext += 3;&lt;br /&gt;  charsonline += 4;&lt;br /&gt;&lt;br /&gt;  if( lineLength &gt; 0 ) {&lt;br /&gt;   if( charsonline &gt;= lineLength ) {&lt;br /&gt;    charsonline = 0;&lt;br /&gt;    [result appendString:@"\n"];&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; return [NSString stringWithString:result];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#pragma mark -&lt;br /&gt;&lt;br /&gt;- (BOOL) hasPrefix:(NSData *) prefix {&lt;br /&gt; unsigned int length = [prefix length];&lt;br /&gt; if( ! prefix || ! length || [self length] &lt; length ) return NO;&lt;br /&gt; return ( memcmp( [self bytes], [prefix bytes], length ) == 0 );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (BOOL) hasPrefixBytes:(void *) prefix length:(unsigned int) length {&lt;br /&gt; if( ! prefix || ! length || [self length] &lt; length ) return NO;&lt;br /&gt; return ( memcmp( [self bytes], prefix, length ) == 0 );&lt;br /&gt;}&lt;br /&gt;@end&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;File Compress then Encoding, finally Send&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;NSData *fileData = [[NSData alloc] initWithContentsOfFile: filePath];    &lt;br /&gt;  NSData *gzippedData = [fileData gzipDeflate];    &lt;br /&gt;  NSString *base64String = [NSString stringWithFormat:@"z:%@", [gzippedData base64Encoding]];&lt;br /&gt;  [fileData release];&lt;br /&gt;  &lt;br /&gt;  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];&lt;br /&gt;  &lt;br /&gt;  NSString *s = [[NSString alloc] initWithFormat:@"data=%@", base64String];&lt;br /&gt;  DLog(@"log is %@", s);&lt;br /&gt;  [request setHTTPBody:[s dataUsingEncoding:NSUTF8StringEncoding]];&lt;br /&gt;  [s release];&lt;br /&gt;  &lt;br /&gt;  [request setHTTPMethod:@"POST"];&lt;br /&gt;  &lt;br /&gt;  NSURLResponse *response;&lt;br /&gt;  NSError *error;&lt;br /&gt;  [NSURLConnection sendSynchronousRequest:request returningResponse:&amp;response error:&amp;error];&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-7451863100531094877?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/7451863100531094877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/04/nsdataadditions-64encoding.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/7451863100531094877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/7451863100531094877'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/04/nsdataadditions-64encoding.html' title='NSDataAdditions ： 64Encoding...'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-6122186218577017055</id><published>2010-04-07T02:02:00.000-07:00</published><updated>2010-04-07T02:08:13.860-07:00</updated><title type='text'>iPad/iPhone forward geocoding API using Google gecoding service</title><content type='html'>The iPhone (and now iPad) SDK supports reverse geocoding out of the box. Reverse geocoding means you have a coordinate and want to find out where you are located, for instance, the name of the street you are on. Forward geocoding means you know the name of a location and want to find the coordinates. For reasons not totally clear to me there’s no support for forward geocoding, I’ve read somewhere that it has something to do with license deals.&lt;br /&gt;I’ve started working a little with the iPad simulator and with its large display it makes sense presenting information on a map view. Because I haven’t found a good example/API for forward geocoding I’ve decided to publish my own. There are a few players offering geocoding services, Yahoo, CloudeMade, Tele Atlas and of course Google. Yahoo and Google are both free but I’ve decided on using Google.&lt;br /&gt;&lt;br /&gt;This sample iPad application contains a search bar and a large UIMapView. Search results are visualized on the map with a placemark and by clicking the placemark the map will zoom to the viewport returned from the geocoding service. When I started working with the geocoding service it was still in version two, this last week Google launched version three. Version two will be depricated of course but I had already written the parser for version two so I’ve included it as well in my sample. Of course the API works for iPhone as well. Because the API contains quite a lot of code you will find the code inside the sample project at the bottom of this page.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fAv06gZ6FPU/S7xKowP6smI/AAAAAAAAAJg/yaQ_k36U6s4/s1600/Screen+shot+2010-04-07+at+10.04.24.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 295px; height: 233px;" src="http://4.bp.blogspot.com/_fAv06gZ6FPU/S7xKowP6smI/AAAAAAAAAJg/yaQ_k36U6s4/s400/Screen+shot+2010-04-07+at+10.04.24.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5457318912473084514" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Using my Forward geocoding API&lt;br /&gt;&lt;br /&gt;Using BSForwardGeocoder is pretty straight forward. Example below:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;- (void) searchBarSearchButtonClicked:(UISearchBar *)theSearchBar {&lt;br /&gt; &lt;br /&gt; NSLog(@"Searching for: %@", searchBar.text);&lt;br /&gt; if(forwardGeocoder == nil)&lt;br /&gt; {&lt;br /&gt;  forwardGeocoder = [[BSForwardGeocoder alloc] initWithDelegate:self];&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; // Forward geocode!&lt;br /&gt; [forwardGeocoder findLocation:searchBar.text];&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;-(void)forwardGeocoderFoundLocation&lt;br /&gt;{&lt;br /&gt; if(forwardGeocoder.status == G_GEO_SUCCESS)&lt;br /&gt; {&lt;br /&gt;  int searchResults = [forwardGeocoder.results count];&lt;br /&gt; &lt;br /&gt;  // Add placemarks for each result&lt;br /&gt;  for(int i = 0; i &lt; searchResults; i++)&lt;br /&gt;  {&lt;br /&gt;   BSKmlResult *place = [forwardGeocoder.results objectAtIndex:i];&lt;br /&gt; &lt;br /&gt;   // Add a placemark on the map&lt;br /&gt;   CustomPlacemark *placemark = [[CustomPlacemark alloc] initWithRegion:place.coordinateRegion];&lt;br /&gt;   placemark.title = place.address;&lt;br /&gt;   [mapView addAnnotation:placemark]; &lt;br /&gt; &lt;br /&gt;   NSArray *countryName = [place findAddressComponent:@"country"];&lt;br /&gt;   if([countryName count] &gt; 0)&lt;br /&gt;   {&lt;br /&gt;    NSLog(@"Country: %@", ((BSAddressComponent*)[countryName objectAtIndex:0]).longName );&lt;br /&gt;   }&lt;br /&gt; &lt;br /&gt;   [countryName release];&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  if([forwardGeocoder.results count] == 1)&lt;br /&gt;  {&lt;br /&gt;   BSKmlResult *place = [forwardGeocoder.results objectAtIndex:0];&lt;br /&gt; &lt;br /&gt;   // Zoom into the location  &lt;br /&gt;   [mapView setRegion:place.coordinateRegion animated:TRUE];&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  // Dismiss the keyboard&lt;br /&gt;  [searchBar resignFirstResponder];&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;When search has executed the geocoder contains the result and a status code. The status code is from Google and to support both version 2 and 3 of the API there’s an enum containing response codes. If everything goes well the status should be “G_GEO_SUCCESS” and the “results” property will contain an array of BSKmlResult objects which contain the location information returned for the query. Here’s an example query for my home town Stockholm (Google geocoding service version 3) : http://maps.google.com/maps/api/geocode/xml?address=stockholm&amp;sensor=false.&lt;br /&gt;The details for the service can be found here: http://code.google.com/apis/maps/documentation/geocoding/.&lt;br /&gt;There are multiple arguments you can pass to the search url, you should read the geocoding documentation and check the search url in the application before you implement this in your own app.&lt;br /&gt;&lt;br /&gt;BSForwardGeocoder&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#import &lt;Foundation/Foundation.h&gt;&lt;br /&gt;#import "BSGoogleV2KmlParser.h"&lt;br /&gt;#import "BSGoogleV3KmlParser.h"&lt;br /&gt; &lt;br /&gt;// Enum for geocoding status responses&lt;br /&gt;enum {&lt;br /&gt; G_GEO_SUCCESS = 200,&lt;br /&gt; G_GEO_BAD_REQUEST = 400,&lt;br /&gt; G_GEO_SERVER_ERROR = 500,&lt;br /&gt; G_GEO_MISSING_QUERY = 601,&lt;br /&gt; G_GEO_UNKNOWN_ADDRESS = 602,&lt;br /&gt; G_GEO_UNAVAILABLE_ADDRESS = 603,&lt;br /&gt; G_GEO_UNKNOWN_DIRECTIONS = 604,&lt;br /&gt; G_GEO_BAD_KEY = 610,&lt;br /&gt; G_GEO_TOO_MANY_QUERIES = 620 &lt;br /&gt;};&lt;br /&gt; &lt;br /&gt;@protocol BSForwardGeocoderDelegate &lt;NSObject&gt;&lt;br /&gt;@required&lt;br /&gt;-(void)forwardGeocoderFoundLocation;&lt;br /&gt;@optional&lt;br /&gt;-(void)forwardGeocoderError:(NSString *)errorMessage;&lt;br /&gt;@end&lt;br /&gt; &lt;br /&gt;@interface BSForwardGeocoder : NSObject {&lt;br /&gt; NSString *searchQuery;&lt;br /&gt; NSString *googleAPiKey;&lt;br /&gt; int status;&lt;br /&gt; NSArray *results;&lt;br /&gt; id&lt;BSForwardGeocoderDelegate&gt; delegate;&lt;br /&gt;}&lt;br /&gt;-(id) initWithDelegate:(id&lt;BSForwardGeocoderDelegate&gt;)del;&lt;br /&gt;-(void) findLocation:(NSString *)searchString;&lt;br /&gt; &lt;br /&gt;@property (assign) id&lt;BSForwardGeocoderDelegate&gt; delegate;&lt;br /&gt;@property (nonatomic, retain) NSString *searchQuery;&lt;br /&gt;@property (nonatomic, readonly) int status;&lt;br /&gt;@property (nonatomic, retain) NSArray *results;&lt;br /&gt; &lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;BSKmlResult&lt;br /&gt;The result class is the same for both version 2 and 3 of the service. A big difference in the returned information between the versions is the way address components are returned, in version three more information is returned and therefore I’ve created another class to store the address component information. The properties: countryNameCode, countryName, subAdministrativeAreaName and localityName are for version two only. For version three all address information is stored in the “addressComponents” array (contains BSAddressComponent objects). Because there is really no reason to use version 2 anymore you probably want to remove this code for your own application.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#import &lt;Foundation/Foundation.h&gt;&lt;br /&gt;#import &lt;MapKit/MapKit.h&gt;&lt;br /&gt;#import "BSAddressComponent.h"&lt;br /&gt; &lt;br /&gt;@interface BSKmlResult : NSObject {&lt;br /&gt; NSString *address;&lt;br /&gt; NSString *countryNameCode;&lt;br /&gt; NSString *countryName;&lt;br /&gt; NSString *subAdministrativeAreaName;&lt;br /&gt; NSString *localityName;&lt;br /&gt; float viewportSouthWestLat;&lt;br /&gt; float viewportSouthWestLon;&lt;br /&gt; float viewportNorthEastLat;&lt;br /&gt; float viewportNorthEastLon;&lt;br /&gt; float boundsSouthWestLat;&lt;br /&gt; float boundsSouthWestLon;&lt;br /&gt; float boundsNorthEastLat;&lt;br /&gt; float boundsNorthEastLon;&lt;br /&gt; float latitude;&lt;br /&gt; float longitude;&lt;br /&gt; float height;&lt;br /&gt; NSInteger accuracy;&lt;br /&gt; NSArray *addressComponents;&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt;@property (nonatomic, retain) NSString *address;&lt;br /&gt;@property (nonatomic, assign) NSInteger accuracy;&lt;br /&gt;@property (nonatomic, retain) NSString *countryNameCode;&lt;br /&gt;@property (nonatomic, retain) NSString *countryName;&lt;br /&gt;@property (nonatomic, retain) NSString *subAdministrativeAreaName;&lt;br /&gt;@property (nonatomic, retain) NSString *localityName;&lt;br /&gt;@property (nonatomic, retain) NSArray *addressComponents;&lt;br /&gt;@property (nonatomic, assign) float latitude;&lt;br /&gt;@property (nonatomic, assign) float longitude;&lt;br /&gt;@property (nonatomic, assign) float viewportSouthWestLat;&lt;br /&gt;@property (nonatomic, assign) float viewportSouthWestLon;&lt;br /&gt;@property (nonatomic, assign) float viewportNorthEastLat;&lt;br /&gt;@property (nonatomic, assign) float viewportNorthEastLon;&lt;br /&gt;@property (nonatomic, assign) float boundsSouthWestLat;&lt;br /&gt;@property (nonatomic, assign) float boundsSouthWestLon;&lt;br /&gt;@property (nonatomic, assign) float boundsNorthEastLat;&lt;br /&gt;@property (nonatomic, assign) float boundsNorthEastLon;&lt;br /&gt;@property (readonly) CLLocationCoordinate2D coordinate;&lt;br /&gt;@property (readonly) MKCoordinateSpan coordinateSpan;&lt;br /&gt;@property (readonly) MKCoordinateRegion coordinateRegion;&lt;br /&gt; &lt;br /&gt;-(NSArray*)findAddressComponent:(NSString*)typeName;&lt;br /&gt; &lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;To make it somewhat simple to find address components I’ve added a method that will search for components for you. Using version 3 of the geocoding service you will get the country name using this code:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;NSArray *countryName = [BSKmlResultPlace findAddressComponent:@"country"];&lt;br /&gt;if([countryName count] &gt; 0)&lt;br /&gt;{&lt;br /&gt; NSLog(@"Country: %@", ((BSAddressComponent*)[countryName objectAtIndex:0]).longName );&lt;br /&gt;}&lt;br /&gt;[countryName release];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;There are also properties to make the result simple to use with a MKMapView. The “coordinate” property returns a CLLocationCoordinate2D object, “coordinateSpan” calculates and returns a MKCoordinateSpan object for setting the map viewport. The “coordinateRegion” combines both coordinate and coordinateSpan returning a MKCoordinateRegion object that can be used to directly move your MKMapView to the right place.&lt;br /&gt;&lt;br /&gt;BSAddressComponent&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#import &lt;Foundation/Foundation.h&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;@interface BSAddressComponent : NSObject {&lt;br /&gt; NSString *longName;&lt;br /&gt; NSString *shortName;&lt;br /&gt; NSArray *types;&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt;@property (nonatomic, retain) NSString *longName;&lt;br /&gt;@property (nonatomic, retain) NSString *shortName;&lt;br /&gt;@property (nonatomic, retain) NSArray *types;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Learned from[url]http://blog.sallarp.com/ipad-iphone-forward-geocoding-api-google/[/url]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-6122186218577017055?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/6122186218577017055/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/04/ipadiphone-forward-geocoding-api-using.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/6122186218577017055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/6122186218577017055'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/04/ipadiphone-forward-geocoding-api-using.html' title='iPad/iPhone forward geocoding API using Google gecoding service'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_fAv06gZ6FPU/S7xKowP6smI/AAAAAAAAAJg/yaQ_k36U6s4/s72-c/Screen+shot+2010-04-07+at+10.04.24.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-5600942902160140630</id><published>2010-04-07T01:50:00.000-07:00</published><updated>2010-04-07T01:51:19.910-07:00</updated><title type='text'>Zip Compression</title><content type='html'>&lt;pre&gt;&lt;br /&gt;#import &lt;Foundation/Foundation.h&gt;&lt;br /&gt;&lt;br /&gt;@interface NSData (DDData)&lt;br /&gt;&lt;br /&gt;// gzip compression utilities&lt;br /&gt;- (NSData *)gzipInflate;&lt;br /&gt;- (NSData *)gzipDeflate;&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#import "DDData.h"&lt;br /&gt;#include "zlib.h"&lt;br /&gt;&lt;br /&gt;@implementation NSData (DDData)&lt;br /&gt;&lt;br /&gt;- (NSData *)gzipInflate&lt;br /&gt;{&lt;br /&gt; if ([self length] == 0) return self;&lt;br /&gt; &lt;br /&gt; unsigned full_length = [self length];&lt;br /&gt; unsigned half_length = [self length] / 2;&lt;br /&gt; &lt;br /&gt; NSMutableData *decompressed = [NSMutableData dataWithLength: full_length + half_length];&lt;br /&gt; BOOL done = NO;&lt;br /&gt; int status;&lt;br /&gt; &lt;br /&gt; z_stream strm;&lt;br /&gt; strm.next_in = (Bytef *)[self bytes];&lt;br /&gt; strm.avail_in = [self length];&lt;br /&gt; strm.total_out = 0;&lt;br /&gt; strm.zalloc = Z_NULL;&lt;br /&gt; strm.zfree = Z_NULL;&lt;br /&gt; &lt;br /&gt; if (inflateInit2(&amp;strm, (15+32)) != Z_OK) return nil;&lt;br /&gt; while (!done)&lt;br /&gt; {&lt;br /&gt;  // Make sure we have enough room and reset the lengths.&lt;br /&gt;  if (strm.total_out &gt;= [decompressed length])&lt;br /&gt;   [decompressed increaseLengthBy: half_length];&lt;br /&gt;  strm.next_out = (Bytef *)[decompressed mutableBytes] + strm.total_out;&lt;br /&gt;  strm.avail_out = [decompressed length] - strm.total_out;&lt;br /&gt;  &lt;br /&gt;  // Inflate another chunk.&lt;br /&gt;  status = inflate (&amp;strm, Z_SYNC_FLUSH);&lt;br /&gt;  if (status == Z_STREAM_END) done = YES;&lt;br /&gt;  else if (status != Z_OK) break;&lt;br /&gt; }&lt;br /&gt; if (inflateEnd (&amp;strm) != Z_OK) return nil;&lt;br /&gt; &lt;br /&gt; // Set real length.&lt;br /&gt; if (done)&lt;br /&gt; {&lt;br /&gt;  [decompressed setLength: strm.total_out];&lt;br /&gt;  return [NSData dataWithData: decompressed];&lt;br /&gt; }&lt;br /&gt; else return nil;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (NSData *)gzipDeflate&lt;br /&gt;{&lt;br /&gt; if ([self length] == 0) return self;&lt;br /&gt; &lt;br /&gt; z_stream strm;&lt;br /&gt; &lt;br /&gt; strm.zalloc = Z_NULL;&lt;br /&gt; strm.zfree = Z_NULL;&lt;br /&gt; strm.opaque = Z_NULL;&lt;br /&gt; strm.total_out = 0;&lt;br /&gt; strm.next_in=(Bytef *)[self bytes];&lt;br /&gt; strm.avail_in = [self length];&lt;br /&gt; &lt;br /&gt; // Compresssion Levels:&lt;br /&gt; //   Z_NO_COMPRESSION&lt;br /&gt; //   Z_BEST_SPEED&lt;br /&gt; //   Z_BEST_COMPRESSION&lt;br /&gt; //   Z_DEFAULT_COMPRESSION&lt;br /&gt; &lt;br /&gt; if (deflateInit2(&amp;strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, (15+16), 8, Z_DEFAULT_STRATEGY) != Z_OK) return nil;&lt;br /&gt; &lt;br /&gt; NSMutableData *compressed = [NSMutableData dataWithLength:16384];  // 16K chunks for expansion&lt;br /&gt; &lt;br /&gt; do {&lt;br /&gt;  &lt;br /&gt;  if (strm.total_out &gt;= [compressed length])&lt;br /&gt;   [compressed increaseLengthBy: 16384];&lt;br /&gt;  &lt;br /&gt;  strm.next_out = (Bytef *)[compressed mutableBytes] + strm.total_out;&lt;br /&gt;  strm.avail_out = [compressed length] - strm.total_out;&lt;br /&gt;  &lt;br /&gt;  deflate(&amp;strm, Z_FINISH);  &lt;br /&gt;  &lt;br /&gt; } while (strm.avail_out == 0);&lt;br /&gt; &lt;br /&gt; deflateEnd(&amp;strm);&lt;br /&gt; &lt;br /&gt; [compressed setLength: strm.total_out];&lt;br /&gt; return [NSData dataWithData:compressed];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-5600942902160140630?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/5600942902160140630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/04/zip-compression.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5600942902160140630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5600942902160140630'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/04/zip-compression.html' title='Zip Compression'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-3566750065004399821</id><published>2010-04-02T16:38:00.001-07:00</published><updated>2010-04-02T16:42:26.320-07:00</updated><title type='text'>工厂模式的简单理解</title><content type='html'>工厂模式的简单理解&lt;br /&gt;&lt;br /&gt;简单工厂模式&lt;br /&gt;&lt;br /&gt;首先,如果一个客户要用到一款手机,一般的做法是客户去创建一款手机,然后拿来用:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fAv06gZ6FPU/S7aAG2GdIBI/AAAAAAAAAJA/C_Luij6W_5M/s1600/image_thumb%5B26%5D.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 212px;" src="http://1.bp.blogspot.com/_fAv06gZ6FPU/S7aAG2GdIBI/AAAAAAAAAJA/C_Luij6W_5M/s400/image_thumb%5B26%5D.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5455688853696094226" /&gt;&lt;/a&gt;&lt;br /&gt;这时,客户需要知道怎么去创建一款手机,客户和手机就紧密耦合在一起了.为了降低耦合,就出现了工厂类,把创建手机的操作放到了工厂里面去,客户直接使用工厂的创建手机方法,传入想要的手机型号就行了,而不必去知道创建的细节.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fAv06gZ6FPU/S7aARTLj35I/AAAAAAAAAJI/ZEE4bo0-4wg/s1600/image_thumb%5B37%5D.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 236px;" src="http://1.bp.blogspot.com/_fAv06gZ6FPU/S7aARTLj35I/AAAAAAAAAJI/ZEE4bo0-4wg/s400/image_thumb%5B37%5D.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5455689033300828050" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;工厂方法模式&lt;br /&gt;&lt;br /&gt;随着手机种类越来越多,简单工厂模式出现了弊端,每次新加入手机品种,工厂类都要加入新的创建逻辑.这时我们就可以把工厂类定义成了接口,而每增加一种新的手机,就增加该手机对应工厂类的实现,这样工厂的设计就可以扩展了,而不必去修改原来的代码:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fAv06gZ6FPU/S7aAh6CTtUI/AAAAAAAAAJQ/3_i77eMcenE/s1600/image_thumb%5B36%5D.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 184px;" src="http://3.bp.blogspot.com/_fAv06gZ6FPU/S7aAh6CTtUI/AAAAAAAAAJQ/3_i77eMcenE/s400/image_thumb%5B36%5D.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5455689318608909634" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;抽象工厂模式&lt;br /&gt;&lt;br /&gt;随着工厂规模的继续扩大,工厂开始生产充电器了.这时候工厂有二个系列的产品:手机和充电器.而手机必须使用对应的充电器才能使用.这时候分别使用一个手机工厂和一个充电器工厂都不能满足我们的需求,我们必须确认手机跟充电器的对应关系.我们把工厂改造一下,把手机工厂跟充电器工厂联系在一起:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fAv06gZ6FPU/S7aAst0YEDI/AAAAAAAAAJY/y-CgyWQu6xA/s1600/image_thumb%5B57%5D.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 206px;" src="http://3.bp.blogspot.com/_fAv06gZ6FPU/S7aAst0YEDI/AAAAAAAAAJY/y-CgyWQu6xA/s400/image_thumb%5B57%5D.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5455689504307810354" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;转自http://www.javaeye.com/topic/630198&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-3566750065004399821?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/3566750065004399821/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/04/blog-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/3566750065004399821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/3566750065004399821'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/04/blog-post.html' title='工厂模式的简单理解'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_fAv06gZ6FPU/S7aAG2GdIBI/AAAAAAAAAJA/C_Luij6W_5M/s72-c/image_thumb%5B26%5D.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-5070829486773334473</id><published>2010-04-01T08:08:00.000-07:00</published><updated>2010-04-01T08:09:22.439-07:00</updated><title type='text'>Get source from iPhone App</title><content type='html'>Open Terminal in OSX&lt;br /&gt; Enter the command:    cd music/itunes/"mobile applications"&lt;br /&gt; Enter the command:   ls&lt;br /&gt; You should see Doom.ipa listed.  If not then you need to make sure that Doom is backed up to your iTunes Library&lt;br /&gt; Enter the command:   cp Doom.ipa Doom.zip&lt;br /&gt; This copies and renames your iTunes backup of Doom&lt;br /&gt; Open Finder&lt;br /&gt; Go to the folder:   /Users/username/Music/iTunes/Mobile Applications/   (where "username" is your username)&lt;br /&gt; You should see Doom.zip listed&lt;br /&gt; Double click Doom.zip to uncompress&lt;br /&gt; Navigate to the new folder (should be named "Payload")&lt;br /&gt; Right click on Doom.app and choose "Show Package Contents"&lt;br /&gt; This will open a new Finder displaying the contents of Doom.app&lt;br /&gt; Copy the base folder&lt;br /&gt; Paste the base folder in the DoomSource folder&lt;br /&gt; Open  the Doom xcode project located at ../DoomSource/code/iphone/Doom.xcodeproj&lt;br /&gt; Click on "Build and Go" or press "command + R" to build and then run Doom&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-5070829486773334473?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/5070829486773334473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/04/get-source-from-iphone-app.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5070829486773334473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5070829486773334473'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/04/get-source-from-iphone-app.html' title='Get source from iPhone App'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-5513752918862908081</id><published>2010-03-27T05:39:00.001-07:00</published><updated>2010-03-27T05:39:26.549-07:00</updated><title type='text'>保持圆角的CCSprite</title><content type='html'>@interface StretchableSprite : CCSprite {&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;+(id)spriteWithFile:(NSString*)file size:(CGSize)size leftCap:(NSInteger)leftcap topCap:(NSInteger)topcap;&lt;br /&gt;-(id)initWithFile:(NSString*)file size:(CGSize)size leftCap:(NSInteger)leftcap topCap:(NSInteger)topcap;&lt;br /&gt;@end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;@implementation StretchableSprite&lt;br /&gt;+(id)spriteWithFile:(NSString*)file size:(CGSize)size leftCap:(NSInteger)leftcap topCap:(NSInteger)topcap{&lt;br /&gt;    return [[[self alloc] initWithFile:file size:size leftCap:leftcap topCap:topcap] autorelease];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-(id)initWithFile:(NSString*)file size:(CGSize)size leftCap:(NSInteger)leftcap topCap:(NSInteger)topcap{&lt;br /&gt;    UIImage* image = [UIImage imageNamed:file];&lt;br /&gt;    CGImageRef base = image.CGImage;&lt;br /&gt;    CGContextRef context = CGBitmapContextCreate(nil,&lt;br /&gt;                                                 size.width,&lt;br /&gt;                                                 size.height,&lt;br /&gt;                                                 CGImageGetBitsPerComponent(base),&lt;br /&gt;                                                 4 * size.width,&lt;br /&gt;                                                 CGImageGetColorSpace(base),&lt;br /&gt;                                                 kCGImageAlphaPremultipliedLast | kCGBitmapByteOrderDefault);&lt;br /&gt;&lt;br /&gt;    float BASE_COL_WIDTH[] = {leftcap,1,image.size.width - leftcap -1};&lt;br /&gt;    float BASE_ROW_HEIGHT[] = {topcap,1,image.size.height - topcap -1};&lt;br /&gt;    float BASE_COL_X[] = {0,leftcap,leftcap + 1};&lt;br /&gt;    float BASE_ROW_Y[] = {0,topcap,topcap +1};&lt;br /&gt;    &lt;br /&gt;    float TARGET_COL_WIDTH[] = {BASE_COL_WIDTH[0], size.width - BASE_COL_WIDTH[0] - BASE_COL_WIDTH[2], BASE_COL_WIDTH[2]};&lt;br /&gt;    float TARGET_ROW_HEIGHT[] = {BASE_ROW_HEIGHT[0], size.height - BASE_ROW_HEIGHT[0] - BASE_ROW_HEIGHT[2], BASE_ROW_HEIGHT[2]};&lt;br /&gt;    float TARGET_COL_X[] = {0,TARGET_COL_WIDTH[0],TARGET_COL_WIDTH[0]+TARGET_COL_WIDTH[1]};&lt;br /&gt;    float TARGET_ROW_Y[] = {size.height - TARGET_ROW_HEIGHT[0],&lt;br /&gt;        size.height - TARGET_ROW_HEIGHT[0] - TARGET_ROW_HEIGHT[1],&lt;br /&gt;        size.height - TARGET_ROW_HEIGHT[0] - TARGET_ROW_HEIGHT[1] - TARGET_ROW_HEIGHT[2]};&lt;br /&gt;    &lt;br /&gt;    for (int row=0; row&lt;3; row++) {&lt;br /&gt;        for (int col=0; col&lt;3; col++) {&lt;br /&gt;            CGRect source = CGRectMake(BASE_COL_X[col], BASE_ROW_Y[row], BASE_COL_WIDTH[col], BASE_ROW_HEIGHT[row]);&lt;br /&gt;            CGRect target = CGRectMake(TARGET_COL_X[col], TARGET_ROW_Y[row], TARGET_COL_WIDTH[col], TARGET_ROW_HEIGHT[row]);&lt;br /&gt;            CGImageRef ref = CGImageCreateWithImageInRect(base, source);&lt;br /&gt;            CGContextDrawImage(context, target, ref);&lt;br /&gt;            CFRelease(ref);&lt;br /&gt;        }&lt;br /&gt;    }    &lt;br /&gt;    CGImageRef final = CGBitmapContextCreateImage(context);&lt;br /&gt;    CGContextRelease(context);&lt;br /&gt;    return [super initWithCGImage:final key:@"stretchable"];&lt;br /&gt;}&lt;br /&gt;@end&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-5513752918862908081?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/5513752918862908081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/03/ccsprite.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5513752918862908081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5513752918862908081'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/03/ccsprite.html' title='保持圆角的CCSprite'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-7530012674038548055</id><published>2010-03-21T06:24:00.001-07:00</published><updated>2010-03-21T06:25:01.692-07:00</updated><title type='text'>如何在你的应用程序中使用Openfeint (在线排行 成就系统 挑战功能)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fAv06gZ6FPU/S6YeGeMO1nI/AAAAAAAAAI4/tPGwfBh7Cfw/s1600-h/Screen+shot+2010-03-21+at+13.23.54.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 267px; height: 400px;" src="http://4.bp.blogspot.com/_fAv06gZ6FPU/S6YeGeMO1nI/AAAAAAAAAI4/tPGwfBh7Cfw/s400/Screen+shot+2010-03-21+at+13.23.54.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5451077495510980210" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;游戏也好，程序也好，随着用户的增加，难免会有需要增加一个在线排行的功能，这样的好处有很多，比较特别的有两点。&lt;br /&gt;1. 不用考虑虚拟键盘调用后进行的用户名输入,我就是觉得做个虚拟键盘输入名字做rank让我很崩溃所以才出此“下策”&lt;br /&gt;2. 即时监控用户登录情况，随着每个用户的成绩提交，可以大致知道自己的游戏有多少用户。&lt;br /&gt;&lt;br /&gt;目前我们的选择有两个，一个是plus+ ，本来我想用它，因为我觉得plus+这个logo和颜色跟我的游戏内容比较合，奈何落花有意流水无情，我申请完等了一个星期后被他否掉 ，在这样半被迫的情况下，我选择了openfeint，并且深深为它的功能所折服，不敢专美，与各位有需要的朋友分享。&lt;br /&gt;&lt;br /&gt;注意，我这里说的情况是在原生程序中使用openfeint，u3d的引擎的不在我的讨论之列。另外我是web程序员出身，很多描述也许不够专业和精确，请各位指出及海涵。&lt;br /&gt;&lt;br /&gt;首先，在官网注册为开发者，建立一个项目，你会得到一个项目的client id（用于提问），一个产品编号跟一个密钥，这将放置于程序中，注意不要输错，我曾经因为少粘贴了一位密钥&lt;br /&gt;结果载入程序界面老是报莫名的错误。后来还是经过Fwish版主的提醒（他也曾经遇到一样的报错），才发现问题所在。&lt;br /&gt;在官网下载SDK，察看它包里的readme，注意看 Building OpenFeint With Your Project 部分&lt;br /&gt;一步一步照做，注意第九步 9. You must have a prefix header. It must have the following line: #import "OpenFeintPrefix.pch"&lt;br /&gt;这个是加在 项目名_Prefix.pch这个文件的最后就可以了。&lt;br /&gt;一般来说，编译出 4000多个错的话，多半是这里没加。另外要将所有#import到openfeint头文件的.m文件的扩展名通通改为.mm，以实现objectC和 C++的混合编译。&lt;br /&gt;&lt;br /&gt;完成以上步骤后，可以尝试编译一下，能够顺利编译就没有问题了。&lt;br /&gt;&lt;br /&gt;接下来要做的可以在 openfeint附带的sample里面看到，它的sample写得还是比较仔细的，不过它用的是UIKit和nib文件，所以开发游戏的还要根据自己的引擎做一些修改。&lt;br /&gt;&lt;br /&gt;首先，在"项目名AppDelegate.mm"的文件里加入openfeint的载入定义部分，以让其在每次程序 load完以后就起作用。&lt;br /&gt;- (void) startup&lt;br /&gt;{&lt;br /&gt;    ofDelegate = [MyOFDelegate new];&lt;br /&gt;    //ofNotificationDelegate = [SampleOFNotificationDelegate new];&lt;br /&gt;    //ofChallengeDelegate = [SampleOFChallengeDelegate new];&lt;br /&gt;    NSDictionary* settings = [NSDictionary dictionaryWithObjectsAndKeys:&lt;br /&gt;                              [NSNumber numberWithInt: UIDeviceOrientationPortrait],&lt;br /&gt;                              OpenFeintSettingDashboardOrientation,@"ArithMaster",&lt;br /&gt;                              OpenFeintSettingShortDisplayName,  &lt;br /&gt;                              [NSNumber numberWithBool:YES],&lt;br /&gt;                              OpenFeintSettingEnablePushNotifications,&lt;br /&gt;                              [NSNumber numberWithBool:NO],&lt;br /&gt;                              OpenFeintSettingDisableUserGeneratedContent,nil];&lt;br /&gt;    ofChallengeDelegate = [MyChallengeDelegate new];&lt;br /&gt;    OFDelegatesContainer* delegates = [OFDelegatesContainer containerWithOpenFeintDelegate:ofDelegate&lt;br /&gt;                                                                      andChallengeDelegate:ofChallengeDelegate&lt;br /&gt;                                                                   andNotificationDelegate:nil];&lt;br /&gt;    //OFDelegatesContainer* delegates = [OFDelegatesContainer containerWithOpenFeintDelegate:ofDelegate];&lt;br /&gt;    [OpenFeint initializeWithProductKey:@"这里输入key"&lt;br /&gt;                              andSecret:@" 这里输入密钥"&lt;br /&gt;                         andDisplayName:@"Airthmetic Master"&lt;br /&gt;                            andSettings:settings    // see OpenFeintSettings.h&lt;br /&gt;                           andDelegates:delegates];              // see OFDelegatesContainer.h&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;代码中ofDelegate和ofChallengeDelegate两个代理分别对应于OF的启动以及challenge模式的启动。&lt;br /&gt;这两个类的具体写法可以参考sample中的例子，我基本上照抄了。&lt;br /&gt;&lt;br /&gt;这样做完以后，可以通过执行  [OpenFeint launchDashboard]来进入OF界面，官方文档中建议这个可以作为一个按钮的绑定方法来实现。&lt;br /&gt;&lt;br /&gt;另外重要的文档就在开发者界面里面指定功能里，点击问号会进入帮助界面，会告诉你功能相关头文件和基本的用法，注意调用方法的时候需要察看一下是否包含了带有该方法的头文件。&lt;br /&gt;&lt;br /&gt;接下来我说说怎么提交成绩，很简单，就一句 [OFHighScoreService setHighScore: score forLeaderboard:@"排行榜id" onSuccess:OFDelegate() onFailure:OFDelegate()];&lt;br /&gt;这个排行榜id是通过在leaderboard里面新建leaderboard取得的，在它的配置选项里可以选择成绩按照降序还是升序排列。一般都认为成绩是降序的，其实也不其然，比如我的《算术大师》，时间越短排行越高，就要按照升序排列。&lt;br /&gt;&lt;br /&gt;至于提交成就也就一句 [OFAchievementService unlockAchievement: @"成就id" onSuccess: OFDelegate() onFailure: OFDelegate()];&lt;br /&gt;这些成就可以在任何条件判断后执行，比如我指定了一个成就在成绩低于12秒的时候触发，就可以写 if(costsecond &lt; 12) 触发成就 ，可以放心的是在你解锁了该成就以后，再次达到成就触发条件也不会重复触发成就。&lt;br /&gt;&lt;br /&gt;以上两个都是OF的基本功能，使用也相对简单，我接下来要说的是高级功能里面的challenge，我为这个折腾了两个晚上，苦于资料稀缺，无人可问，终于攻克。&lt;br /&gt;challenge就是挑战功能，我的理解是它其实是一种延时对战机制，用户A在完成了指定的游戏以后，可以将游戏过程数据和结果打包传输到OF的服务器上，然后你的被挑战者从服务器上下载这些数据，以跟你同样的条件进行游戏，并且在最后跟你的游戏成绩比较，这样就完成了一次挑战的过程。大家或许也想到了，在《算术大师》里，这种机制跟游戏的相性天然吻合，我的实现是把“被挑战者下载数据以后做完题目跟挑战者比较”这个过程当成两个西部牛仔的对决，谁速度更快，谁就能够打落对方的帽子。OF的文档里提到，这个同样适用于赛车游戏的场合，挑战者的数据可以作为一辆幽灵车显示在被挑战者的画面中，可以想见，被挑战者更加不允许犯错，所以还是能够增加游戏的乐趣和对抗程度的。&lt;br /&gt;&lt;br /&gt;下面说说代码，首先是发送挑战，这个相对简单，直接上代码吧&lt;br /&gt;- (void)_sendChallenge&lt;br /&gt;{&lt;br /&gt;     ChallengeData  data;&lt;br /&gt;&lt;br /&gt;    data.score = score; //给挑战数据赋值&lt;br /&gt;&lt;br /&gt;    NSData* challengeData = [NSData dataWithBytes:(void const*)&amp;data length:sizeof(ChallengeData)];  //这句对我来说比较深奥了，只有敬畏地照抄了&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    [OFChallengeService&lt;br /&gt;     displaySendChallengeModal:@"挑战编号"&lt;br /&gt;     challengeText:[NSString stringWithFormat:@"my score is %d,come on!", score]&lt;br /&gt;     challengeData:challengeData];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;- (void)challenge:(id)sender{&lt;br /&gt;    &lt;br /&gt;    if ([OpenFeint hasUserApprovedFeint])&lt;br /&gt;    {&lt;br /&gt;        [self _sendChallenge];&lt;br /&gt;    }&lt;br /&gt;    else&lt;br /&gt;    {&lt;br /&gt;        OFDelegate nilDelegate;&lt;br /&gt;        OFDelegate sendChallengeDelegate(self, @selector(_sendChallenge));&lt;br /&gt;        [OpenFeint presentUserFeintApprovalModal:sendChallengeDelegate deniedDelegate:nilDelegate];&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;千万注意！根据我的实测，挑战数据似乎是C++的变量比较不会出问题，我用 NSString,NSMutableString结果在打包上传，下载解包后变成了空值，我熬的两个晚上有一个多晚上都在搞这个，结果用了C++的数组，立马就没事情了，所以，可能打包进去的数据需要类似这样的处理data.leftnum=[leftnum objectAtIndex:i] intValue];&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;challenge的delegate，主要是在这个函数里处理&lt;br /&gt;- (void)userLaunchedChallenge:(OFChallengeToUser*)challengeToLaunch withChallengeData:(NSData*)challengeData&lt;br /&gt;前面一个参数里面有挑战的名称，用户等信息，后面一个 NSData里面则是完整的游戏过程数据。&lt;br /&gt;这个只要按照sample里照做就可以了。设置完成后，用户在openfeint内接受挑战后将以这个 delegate为入口进行后续的游戏过程处理。&lt;br /&gt;&lt;br /&gt;最后是挑战结果处理，一般就是写个方法判断输赢平，然后设置两个回调方法&lt;br /&gt;        OFDelegate success(self, @selector(_submittedCompletedChallenge));    &lt;br /&gt;        OFDelegate failure(self, @selector(_failedSubmittingCompletedChallenge));&lt;br /&gt;        [OFChallengeService&lt;br /&gt;         submitChallengeResult:challenge.resourceId&lt;br /&gt;         result:challenge.result&lt;br /&gt;         resultDescription:[NSString stringWithFormat:@"my score is %d,see you next time!", correctnum]&lt;br /&gt;         onSuccess:success&lt;br /&gt;         onFailure:failure];&lt;br /&gt;我建议在 _submittedCompletedChallenge不要回传数据，似乎要按照传过来的数据的格式才行，否则会出错，而回传数据只有一种情况需要用到：就是被挑战者反复尝试挑战挑战者。&lt;br /&gt;&lt;br /&gt;challenge的适用大致就是如此了，不解的话，建议反复研究OF自带的sample，另外挑战模式的测试需要用户注册两个帐户通过在OF的界面下切换来调试，当然，一模拟器一设备是最理想的。&lt;br /&gt;&lt;br /&gt;有一些挑战相关的数据，都是可以从它传给delegate的两个参数里取得的，比如我在游戏里设置了一个成就，就是在"little Cocoa"发出的挑战中打败little Cocoa，则能获得游戏中最大的一个成就：超越开发者，这就需要判断传过来的用户名，通过对OF的源码的研究，我以这样的方式取得了用户名： [challenge.challenge.challenger name] ，当时觉得自己很牛逼，哈哈。&lt;br /&gt;&lt;br /&gt;以上大致就是我在使用 openfeint过程中的一点心得，如果有问题的话请向我提出，如果知道的话，我会尽量解答。&lt;br /&gt;另外OF其实提供了很完备的社区功能，你可以在系统里面发布公告，跟你的用户通过游戏内置的论坛进行交流，发pm给你的用户，这些原本需要复杂代码实现的功能都已经由其替你实现。所以确实能够让你的游戏从一个单机游戏进入多人游戏的世界，从何在乐趣上进步一个台阶。&lt;br /&gt;最后我用一句xbox的口号结束这个教程，这也被写在了我游戏的loading页面：Game Experience may change during online play via openfeint !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-7530012674038548055?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/7530012674038548055/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/03/openfeint_21.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/7530012674038548055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/7530012674038548055'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/03/openfeint_21.html' title='如何在你的应用程序中使用Openfeint (在线排行 成就系统 挑战功能)'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_fAv06gZ6FPU/S6YeGeMO1nI/AAAAAAAAAI4/tPGwfBh7Cfw/s72-c/Screen+shot+2010-03-21+at+13.23.54.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-2022457589278692191</id><published>2010-03-18T15:47:00.000-07:00</published><updated>2010-03-18T15:48:36.589-07:00</updated><title type='text'>Sound iPhone</title><content type='html'>&lt;Pre&gt;&lt;br /&gt;#import &lt;UIKit/UIKit.h&gt;&lt;br /&gt;&lt;br /&gt;@interface CSSound : NSObject {&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;+(void)playSound:(NSString *)soundName;&lt;br /&gt;@end&lt;br /&gt;&lt;/Pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;Pre&gt;&lt;br /&gt;#import "CSSound.h"&lt;br /&gt;#import &lt;AudioToolbox/AudioServices.h&gt;&lt;br /&gt;&lt;br /&gt;@implementation CSSound&lt;br /&gt;+(void)playSound:(NSString *)soundName{&lt;br /&gt; SystemSoundID mySSID;&lt;br /&gt; NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingString:soundName];&lt;br /&gt; &lt;br /&gt; OSStatus error = AudioServicesCreateSystemSoundID( (CFURLRef)[NSURL fileURLWithPath:path], &amp;mySSID);&lt;br /&gt; &lt;br /&gt; if(error == kAudioServicesNoError){&lt;br /&gt;  //DLog(@"successfully contructed sound %@", soundName);&lt;br /&gt;  AudioServicesPlaySystemSound(mySSID);&lt;br /&gt; }else{&lt;br /&gt;  DLog(@"error playing sound %@", soundName);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-2022457589278692191?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/2022457589278692191/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/03/sound-iphone.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/2022457589278692191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/2022457589278692191'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/03/sound-iphone.html' title='Sound iPhone'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-3707699540895002087</id><published>2010-03-17T16:48:00.000-07:00</published><updated>2010-03-17T16:49:10.818-07:00</updated><title type='text'>Soap</title><content type='html'>最近研究了下soap,找不到iphone上好用的soap代码.发现坛子，关于soap的东西也不多，就把自己写的贴出来，请大家批评指正吧。&lt;br /&gt; &lt;br /&gt;用到的提供soap接口的网址是:[url]http://www.Nanonull.com/TimeService/[/url]这个页面有多个方法可以通过soap调用,页面上也有说明.如果用IE的浏览器还能看到此网页提供的wsdl文件.要做soap的webservice首先要了解一些关于webservice和soap的一些基本知识.下面几个网址可能会帮你快速入门.&lt;br /&gt;&lt;br /&gt;soap教程:[url]http://www.w3school.com.cn/soap/index.asp[/url]&lt;br /&gt;使用WSDL发布WebService:[url]http://blog.csdn.net/meiqingsong/archive/2005/04/04/336057.aspx[/url]&lt;br /&gt;&lt;br /&gt;    为了便于理解,我先讲下soap的大体原理:我们在iphone封装soap请求信息,发送到某个提供soap服务的服务器,如下例中我们用到的[url]http://www.Nanonull.com/TimeService/.[/url]服务器能接受和识别soap请求,当它接到请求,就根据客户端的请求情况调用服务器上的某个函数,并将函数返回结果封装成soap反馈信息发送给客户端.客户端接收到soap反馈信息后,进行解析处理,以用户能理解的形式呈现给用户.整个过程就这么简单.&lt;br /&gt;&lt;br /&gt;    好了,假设现在你已经有关于soap的基础知识(没有也没关系,看了例子,再理解就更好理解了),下面我们开始做soap的例子.&lt;br /&gt;&lt;br /&gt;    第一步,建一个Hello_SOAP项目.用IB将Hello_SOAPViewController.xib做成如下图的界面&lt;br /&gt;[img]http://www.aisidechina.com/forum/attachments/month_1002/100225091078ca612f47a30308.png[/img]&lt;br /&gt;然后在Hello_SOAPViewController.h中添加如下代码&lt;br /&gt;[code]&lt;br /&gt;@interface Hello_SOAPViewController : UIViewController &lt;br /&gt;{&lt;br /&gt;        IBOutlet UITextField *nameInput;&lt;br /&gt;        IBOutlet UILabel *greeting;&lt;br /&gt;&lt;br /&gt;        NSMutableData *webData;&lt;br /&gt;        NSMutableString *soapResults;&lt;br /&gt;        NSXMLParser *xmlParser;&lt;br /&gt;        BOOL recordResults;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@property(nonatomic, retain) IBOutlet UITextField *nameInput;&lt;br /&gt;@property(nonatomic, retain) IBOutlet UILabel *greeting;&lt;br /&gt;&lt;br /&gt;@property(nonatomic, retain) NSMutableData *webData;&lt;br /&gt;@property(nonatomic, retain) NSMutableString *soapResults;&lt;br /&gt;@property(nonatomic, retain) NSXMLParser *xmlParser;&lt;br /&gt;&lt;br /&gt;-(IBAction)buttonClick: (id) sender;&lt;br /&gt;- (void)getOffesetUTCTimeSOAP;&lt;br /&gt;[/code]&lt;br /&gt;然后在Hello_SOAPViewController.xib中将两个输出口和一个动作连接好,这个不用手把手吧?&lt;br /&gt;在Hello_SOAPViewController.m文件中加入以下方法 :&lt;br /&gt;[code]- (void)getOffesetUTCTimeSOAP&lt;br /&gt;{&lt;br /&gt;        recordResults = NO;&lt;br /&gt;        //封装soap请求消息&lt;br /&gt;        NSString *soapMessage = [NSString stringWithFormat:&lt;br /&gt;                                                         @"&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\n"&lt;br /&gt;                                                         "&lt;soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"&gt;\n"&lt;br /&gt;                                                         "&lt;soap:Body&gt;\n"&lt;br /&gt;                                                         "&lt;getOffesetUTCTime xmlns=\"http://www.Nanonull.com/TimeService/\"&gt;\n"&lt;br /&gt;                                                         "&lt;hoursOffset&gt;%@&lt;/hoursOffset&gt;\n"&lt;br /&gt;                                                         "&lt;/getOffesetUTCTime&gt;\n"&lt;br /&gt;                                                         "&lt;/soap:Body&gt;\n"&lt;br /&gt;                                                         "&lt;/soap:Envelope&gt;\n",nameInput.text&lt;br /&gt;                                                         ];&lt;br /&gt;        NSLog(soapMessage);&lt;br /&gt;        //请求发送到的路径&lt;br /&gt;        NSURL *url = [NSURL URLWithString:@"http://www.nanonull.com/TimeService/TimeService.asmx"];&lt;br /&gt;        NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url];&lt;br /&gt;        NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMessage length]];&lt;br /&gt;        &lt;br /&gt;        //以下对请求信息添加属性前四句是必有的，第五句是soap信息。&lt;br /&gt;        [theRequest addValue: @"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];&lt;br /&gt;        [theRequest addValue: @"http://www.Nanonull.com/TimeService/getOffesetUTCTime" forHTTPHeaderField:@"SOAPAction"];&lt;br /&gt;        &lt;br /&gt;        [theRequest addValue: msgLength forHTTPHeaderField:@"Content-Length"];&lt;br /&gt;        [theRequest setHTTPMethod:@"POST"];&lt;br /&gt;        [theRequest setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]];&lt;br /&gt;        &lt;br /&gt;        //请求&lt;br /&gt;        NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];&lt;br /&gt;        &lt;br /&gt;        //如果连接已经建好，则初始化data&lt;br /&gt;        if( theConnection )&lt;br /&gt;        {&lt;br /&gt;                webData = [[NSMutableData data] retain];&lt;br /&gt;        }&lt;br /&gt;        else&lt;br /&gt;        {&lt;br /&gt;                NSLog(@"theConnection is NULL");&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        &lt;br /&gt;}[/code]&lt;br /&gt;这个方法作用就是封装soap请求,并向服务器发送请求.&lt;br /&gt;代码有注释.不重复讲解.soap并不难,难的是没有案例告诉我们怎么把其它平台的soap移植过来,这里我给出了代码,我相信对iphone开发人员的话应该能看懂了.我在下面会把此案例的源代码附上.如果自己做不出来再看我的代码.如果我这样讲您觉得不够细,那说明您的iphone开发还不是太深入,那么您应该用不到soap技术.可以飘过了.&lt;br /&gt;下面的代码是接收信息并解析,显示到用户界面&lt;br /&gt;[code]-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response&lt;br /&gt;{&lt;br /&gt;        [webData setLength: 0];&lt;br /&gt;        NSLog(@"connection: didReceiveResponse:1");&lt;br /&gt;}&lt;br /&gt;-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data&lt;br /&gt;{&lt;br /&gt;        [webData appendData:data];&lt;br /&gt;        NSLog(@"connection: didReceiveData:2");&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//如果电脑没有连接网络，则出现此信息（不是网络服务器不通）&lt;br /&gt;-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error&lt;br /&gt;{&lt;br /&gt;        NSLog(@"ERROR with theConenction");&lt;br /&gt;        [connection release];&lt;br /&gt;        [webData release];&lt;br /&gt;}&lt;br /&gt;-(void)connectionDidFinishLoading:(NSURLConnection *)connection&lt;br /&gt;{&lt;br /&gt;        NSLog(@"3 DONE. Received Bytes: %d", [webData length]);&lt;br /&gt;        NSString *theXML = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding];&lt;br /&gt;        NSLog(theXML);&lt;br /&gt;        [theXML release];&lt;br /&gt;        &lt;br /&gt;        //重新加載xmlParser&lt;br /&gt;        if( xmlParser )&lt;br /&gt;        {&lt;br /&gt;                [xmlParser release];&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        xmlParser = [[NSXMLParser alloc] initWithData: webData];&lt;br /&gt;        [xmlParser setDelegate: self];&lt;br /&gt;        [xmlParser setShouldResolveExternalEntities: YES];&lt;br /&gt;        [xmlParser parse];&lt;br /&gt;        &lt;br /&gt;        [connection release];&lt;br /&gt;        //[webData release];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *) namespaceURI qualifiedName:(NSString *)qName&lt;br /&gt;attributes: (NSDictionary *)attributeDict&lt;br /&gt;{&lt;br /&gt;        NSLog(@"4 parser didStarElemen: namespaceURI: attributes:");&lt;br /&gt;&lt;br /&gt;                if( [elementName isEqualToString:@"getOffesetUTCTimeResult"])&lt;br /&gt;        {&lt;br /&gt;                if(!soapResults)&lt;br /&gt;                {&lt;br /&gt;                        soapResults = [[NSMutableString alloc] init];&lt;br /&gt;                }&lt;br /&gt;                recordResults = YES;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;}&lt;br /&gt;-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string&lt;br /&gt;{&lt;br /&gt;        NSLog(@"5 parser: foundCharacters:");&lt;br /&gt;&lt;br /&gt;        if( recordResults )&lt;br /&gt;        {&lt;br /&gt;                [soapResults appendString: string];&lt;br /&gt;        }&lt;br /&gt;}&lt;br /&gt;-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName&lt;br /&gt;{&lt;br /&gt;        NSLog(@"6 parser: didEndElement:");&lt;br /&gt;&lt;br /&gt;        if( [elementName isEqualToString:@"getOffesetUTCTimeResult"])&lt;br /&gt;        {&lt;br /&gt;                recordResults = FALSE;&lt;br /&gt;                greeting.text = [[[NSString init]stringWithFormat:@"第%@时区的时间是: ",nameInput.text] stringByAppendingString:soapResults];&lt;br /&gt;                [soapResults release];&lt;br /&gt;                soapResults = nil;&lt;br /&gt;                NSLog(@"hoursOffset result");&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;}&lt;br /&gt;- (void)parserDidStartDocument:(NSXMLParser *)parser{&lt;br /&gt;        NSLog(@"-------------------start--------------");&lt;br /&gt;}&lt;br /&gt;- (void)parserDidEndDocument:(NSXMLParser *)parser{&lt;br /&gt;        NSLog(@"-------------------end--------------");&lt;br /&gt;}[/code]&lt;br /&gt;说明下:&lt;br /&gt;[code]-(void)connectionDidFinishLoading:(NSURLConnection *)connection[/code]&lt;br /&gt;&lt;br /&gt;这个方法是存储接收到的信息&lt;br /&gt;[code]-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName[/code]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-3707699540895002087?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/3707699540895002087/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/03/soap.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/3707699540895002087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/3707699540895002087'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/03/soap.html' title='Soap'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-8971784692299951878</id><published>2010-03-12T14:41:00.000-08:00</published><updated>2010-03-12T14:49:37.389-08:00</updated><title type='text'>连连看算法（JAVA Code）</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fAv06gZ6FPU/S5rDjb7NgiI/AAAAAAAAAIY/PlnmVUEN4Gc/s1600-h/Screen+shot+2010-03-12+at+22.42.42.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 318px; height: 46px;" src="http://3.bp.blogspot.com/_fAv06gZ6FPU/S5rDjb7NgiI/AAAAAAAAAIY/PlnmVUEN4Gc/s400/Screen+shot+2010-03-12+at+22.42.42.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5447881712816980514" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   1. private boolean horizon(Point a, Point b)  &lt;br /&gt;   2.     {  &lt;br /&gt;   3.         if(a.x == b.x &amp;&amp; a.y == b.y)//如果点击的是同一个图案，直接返回false  &lt;br /&gt;   4.             return false;  &lt;br /&gt;   5.         int x_start = a.y &lt;= b.y ? a.y : b.y;  &lt;br /&gt;   6.         int x_end = a.y &lt;= b.y ? b.y : a.y;  &lt;br /&gt;   7.         for(int x = x_start + 1; x &lt; x_end; x++)//只要一个不是-1，直接返回false  &lt;br /&gt;   8.             if(map[a.x][x] != -1){  &lt;br /&gt;   9.                 return false;  &lt;br /&gt;  10.             }  &lt;br /&gt;  11.         return true;  &lt;br /&gt;  12.     }  &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fAv06gZ6FPU/S5rDt2EaZmI/AAAAAAAAAIg/qNB8h_k63Io/s1600-h/Screen+shot+2010-03-12+at+22.43.41.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 40px; height: 164px;" src="http://2.bp.blogspot.com/_fAv06gZ6FPU/S5rDt2EaZmI/AAAAAAAAAIg/qNB8h_k63Io/s400/Screen+shot+2010-03-12+at+22.43.41.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5447881891633587810" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   1. private boolean vertical(Point a, Point b)  &lt;br /&gt;   2. {  &lt;br /&gt;   3.     if(a.x == b.x &amp;&amp; a.y == b.y)  &lt;br /&gt;   4.         return false;  &lt;br /&gt;   5.     int y_start = a.x &lt;= b.x ? a.x : b.x;  &lt;br /&gt;   6.     int y_end = a.x &lt;= b.x ? b.x : a.x;  &lt;br /&gt;   7.     for(int y = y_start + 1; y &lt; y_end; y++)  &lt;br /&gt;   8.         if(map[y][a.y] != -1)  &lt;br /&gt;   9.             return false;  &lt;br /&gt;  10.     return true;  &lt;br /&gt;  11. }  &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fAv06gZ6FPU/S5rD6D0NpFI/AAAAAAAAAIo/OF-A3CEeXlo/s1600-h/Screen+shot+2010-03-12+at+22.44.38.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 160px;" src="http://2.bp.blogspot.com/_fAv06gZ6FPU/S5rD6D0NpFI/AAAAAAAAAIo/OF-A3CEeXlo/s400/Screen+shot+2010-03-12+at+22.44.38.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5447882101482169426" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   1. private boolean oneCorner(Point a, Point b)  &lt;br /&gt;   2. {  &lt;br /&gt;   3.     Point c = new Point(a.x, b.y);  &lt;br /&gt;   4.     Point d = new Point(b.x, a.y);  &lt;br /&gt;   5.     if(map[c.x][c.y] == -1)  &lt;br /&gt;   6.     {  &lt;br /&gt;   7.         boolean method1 = horizon(a, c) &amp;&amp; vertical(b, c);  &lt;br /&gt;   8.             return method1;  &lt;br /&gt;   9.     }  &lt;br /&gt;  10.     if(map[d.x][d.y] == -1)  &lt;br /&gt;  11.     {  &lt;br /&gt;  12.         boolean method2 = vertical(a, d) &amp;&amp; horizon(b, d);  &lt;br /&gt;  13.         return method2;  &lt;br /&gt;  14.     } else  &lt;br /&gt;  15.     {  &lt;br /&gt;  16.         return false;  &lt;br /&gt;  17.     }  &lt;br /&gt;  18. }  &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fAv06gZ6FPU/S5rEK3_BHDI/AAAAAAAAAIw/U0QM8GWPj6c/s1600-h/Screen+shot+2010-03-12+at+22.45.32.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 321px; height: 202px;" src="http://1.bp.blogspot.com/_fAv06gZ6FPU/S5rEK3_BHDI/AAAAAAAAAIw/U0QM8GWPj6c/s400/Screen+shot+2010-03-12+at+22.45.32.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5447882390364036146" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   1. private LinkedList scan(Point a, Point b)  &lt;br /&gt;   2.     {  &lt;br /&gt;   3.         ll = new LinkedList&lt;Line&gt;();  &lt;br /&gt;   4.         //Point c = new Point(a.x, b.y);  &lt;br /&gt;   5.         //Point d = new Point(b.x, a.y);  &lt;br /&gt;   6.         for(int y = a.y; y &gt;= 0; y--)  &lt;br /&gt;   7.             if(map[a.x][y] == -1 &amp;&amp; map[b.x][y] == -1 &amp;&amp; vertical(new Point(a.x, y), new Point(b.x, y)))  &lt;br /&gt;   8.                 ll.add(new Line(0, new Point(a.x, y), new Point(b.x, y)));  &lt;br /&gt;   9.   &lt;br /&gt;  10.         for(int y = a.y; y &lt; map.row; y++)  &lt;br /&gt;  11.             if(map[a.x][y] == -1 &amp;&amp; map[b.x][y] == -1 &amp;&amp; vertical(new Point(a.x, y), new Point(b.x, y)))  &lt;br /&gt;  12.                 ll.add(new Line(0, new Point(a.x, y), new Point(b.x, y)));  &lt;br /&gt;  13.   &lt;br /&gt;  14.         for(int x = a.x; x &gt;= 0; x--)  &lt;br /&gt;  15.             if(map[x][a.y] == -1 &amp;&amp; map[x][b.y] == -1 &amp;&amp; horizon(new Point(x, a.y), new Point(x, b.y)))  &lt;br /&gt;  16.                 ll.add(new Line(1, new Point(x, a.y), new Point(x, b.y)));  &lt;br /&gt;  17.   &lt;br /&gt;  18.         for(int x = a.x; x &lt; map.column; x++)  &lt;br /&gt;  19.             if(map[x][a.y] == -1 &amp;&amp; map[x][b.y] == -1 &amp;&amp; horizon(new Point(x, a.y), new Point(x, b.y)))  &lt;br /&gt;  20.                 ll.add(new Line(1, new Point(x, a.y), new Point(x, b.y)));  &lt;br /&gt;  21.   &lt;br /&gt;  22.         return ll;  &lt;br /&gt;  23.   }  &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   1. private boolean twoCorner(Point a, Point b)  &lt;br /&gt;   2. {  &lt;br /&gt;   3.     ll = scan(a, b);  &lt;br /&gt;   4.     if(ll.isEmpty())  &lt;br /&gt;   5.         return false;  &lt;br /&gt;   6.     for(int index = 0; index &lt; ll.size(); index++){  &lt;br /&gt;   7.         Line line = (Line)ll.get(index);  &lt;br /&gt;   8.         if(line.direct == 1){  &lt;br /&gt;   9.             if(vertical(a, line.a) &amp;&amp; vertical(b, line.b)){  &lt;br /&gt;  10.                 return true;  &lt;br /&gt;  11.             }  &lt;br /&gt;  12.   &lt;br /&gt;  13.         } else  &lt;br /&gt;  14.         if(horizon(a, line.a) &amp;&amp; horizon(b, line.b)){  &lt;br /&gt;  15.             return true;  &lt;br /&gt;  16.         }  &lt;br /&gt;  17.     }  &lt;br /&gt;  18.     return false;  &lt;br /&gt;  19. }  &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;/**************Main Function******************/&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   1. public boolean checkLink(Point a,Point b){  &lt;br /&gt;   2.     if(map[a.x][a.y] != map[b.x][b.y])//如果图案不同，直接为false  &lt;br /&gt;   3.            return false;  &lt;br /&gt;   4.        if(a.x == b.x &amp;&amp; horizon(a, b))  &lt;br /&gt;   5.            return true;  &lt;br /&gt;   6.        if(a.y == b.y &amp;&amp; vertical(a, b))  &lt;br /&gt;   7.            return true;  &lt;br /&gt;   8.        if(oneCorner(a, b))  &lt;br /&gt;   9.            return true;  &lt;br /&gt;  10.        else  &lt;br /&gt;  11.            return twoCorner(a, b);  &lt;br /&gt;  12. }  &lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-8971784692299951878?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/8971784692299951878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/03/java-code.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/8971784692299951878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/8971784692299951878'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/03/java-code.html' title='连连看算法（JAVA Code）'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_fAv06gZ6FPU/S5rDjb7NgiI/AAAAAAAAAIY/PlnmVUEN4Gc/s72-c/Screen+shot+2010-03-12+at+22.42.42.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-1338218340334832512</id><published>2010-03-11T14:49:00.001-08:00</published><updated>2010-03-11T14:49:31.553-08:00</updated><title type='text'>NSFileHandle</title><content type='html'>NSFileHandle *myHandle = [NSFileHandle fileHandleForUpdatingAtPath:appFile];&lt;br /&gt;[myHandle seekToEndOfFile];&lt;br /&gt;[myHandle writeData:data];&lt;br /&gt;[myHandle closeFile];&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Maybe better is:&lt;br /&gt; - on App startup:&lt;br /&gt;     NSFileHandle *myHandle = [NSFileHandle fileHandleForUpdatingAtPath:appFile];&lt;br /&gt;&lt;br /&gt; - on log write&lt;br /&gt; [myHandle seekToEndOfFile];&lt;br /&gt; [myHandle writeData:data];&lt;br /&gt; [myHandle synchronizeFile];&lt;br /&gt;&lt;br /&gt; - on App shutdown&lt;br /&gt; [myHandle closeFile];&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-1338218340334832512?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/1338218340334832512/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/03/nsfilehandle.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/1338218340334832512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/1338218340334832512'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/03/nsfilehandle.html' title='NSFileHandle'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-4723203427449656054</id><published>2010-03-11T03:46:00.000-08:00</published><updated>2010-03-11T03:47:43.928-08:00</updated><title type='text'>LINUX 学习方法、书籍：shell+LAMP+dns+mail+proxy+programming+IDS+filewall+Kernel (转)</title><content type='html'>LINUX 学习方法、书籍：shell+LAMP+dns+mail+proxy+programming+IDS+filewall+Kernel&lt;br /&gt;(http://www.linuxdiyf.com/blog/?74825/action_viewspace_itemid_2056.html)&lt;br /&gt;2007-12-14 08:20:26&lt;br /&gt;LINUX 学习方法、书籍：shell+LAMP+dns+mail+proxy+programming+IDS+filewall+Kernel&lt;br /&gt;&lt;br /&gt;相信很有CUer都有这样的经历，想学习unix系统可是无从下手。其实我想说的是学习UNIX其实并不是想得那样难。&lt;br /&gt;&lt;br /&gt;今天我就将我自己的学习方法总结一下吧，算是给广大cuer一些建议吧。&lt;br /&gt;&lt;br /&gt;１）选择一个适合自己的的系统&lt;br /&gt;对于广大CUer来说，相信大家基本上都没有自己的服务器，很多人都是在VM上跑LINUX&amp;UNIX吧。&lt;br /&gt;&lt;br /&gt;那么我们就要选择linux bsd 等系统而不是•AIX •Solaris 等系统。因为系统构架不同，我们常用的都是基于i686系统。如果公司的服务器可以让你拿来学习除外。&lt;br /&gt;&lt;br /&gt;建议大家使用linux，不单是因为其开源。最主要的是相对来讲学习资料比较多。出现问题要方便解决一点儿。&lt;br /&gt;&lt;br /&gt;２） 选择一个适合自己的的发行版&lt;br /&gt;现在的发行版多多，每个版本都有每个版本的特点。但由于其于命令行，区别也不是很大，内核都一样的，软件也差不多。只不过加了一些有特色的软件罢了。&lt;br /&gt;个人比较喜欢用Debian，因为其apt管理软件方便，个人觉得强于rpm。&lt;br /&gt;&lt;br /&gt;３）　　安装系统时候最好不要安装x环境，因为在一般来说服务器上都是不应该存在这样的软件的。而且这个东东容易出错。&lt;br /&gt;　　　　再者用x常会让人产生惰性。其实用命令行习惯了，感觉比ＧＵＩ下还要快。&lt;br /&gt;&lt;br /&gt;４）不要想一口吃成一个大胖子。&lt;br /&gt;ＵＮＩＸ系统不像win那样，会玩一点小游戏，会安装一些软件就可以自称为高手了。ＵＮＩＸ学习是一个漫长的过程。&lt;br /&gt;&lt;br /&gt;５）学习从先学好英文开始。&lt;br /&gt;其实很多知识书里面都有，只是对于中文资料来讲相对较少。很多国外大公司都出了很多优秀的书籍。其书的质量是国内不能相比的。&lt;br /&gt;所以我们要养成看原版书籍的习惯。再者如果你真的想学习unix的话，英文是必须的。因为在实际的操作中其实都是英文。当然如果你安装汉化的Ｘ，那只能说你没有接触到深层次的，X汉化的只是一个界面。&lt;br /&gt;个人很反感ＵＮＩＸ硬要学习WINDOSW搞那样的界面。UNIX在我眼里面就只会当服务器用，所以在我的学习中不会出现什么显卡配置出错，&lt;br /&gt;wine能玩什么WIN游戏的问题。&lt;br /&gt;&lt;br /&gt;6）多试验！平时最好多用一些原码包自己编译一些软件来试验一下。&lt;br /&gt;把各种所学到的东西都运用到实验之中，这才是进步的最好办法。&lt;br /&gt;&lt;br /&gt;7）学习进程（其实就是应该怎么看书，这才是我写这文的主要目的）&lt;br /&gt;&lt;br /&gt;学习并不是死记命令和参数。 参数那么多谁记得住啊，所以我的建议是先记得一些常用的命令和参数，在日常学习中如果要用到哪一个命令我们再去看他的manual&lt;br /&gt;&lt;br /&gt;推荐一些比较好的书，这些书网上很多地方都可以下，GOOGLE一下就可以了&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;初学的时候可以看看：（如果有是刚接触到UNIX 系统的话，你可以先找一些中文资料先看一个大概 cu上多了，我就不列了）&lt;br /&gt;100_LINUX_TIPS_AND_TRICKS&lt;br /&gt;Linux_in_a_Nutshell_Fifth_Edition&lt;br /&gt;Linux Cookbook&lt;br /&gt;How.Linux.Works.What.Every.Super.User.Should.Know&lt;br /&gt;Hardening_Linux&lt;br /&gt;Linux Complete Command Reference&lt;br /&gt;&lt;br /&gt;学习VI可以看：&lt;br /&gt;Learning The VI Editor&lt;br /&gt;&lt;br /&gt;学习UNIX就要学会配置一些服务&lt;br /&gt;相信我吧，从最简单的vsftpd开始，使自己习惯于写conf&lt;br /&gt;&lt;br /&gt;当学习几个月后相信大家对UNIX有所了解，那么你就可以涉足到服务器的配置上来了&lt;br /&gt;&lt;br /&gt;可以看下面一些书籍：（LAMP组合－linux apache mysql php)&lt;br /&gt;Apache_Server_2.0_Bible&lt;br /&gt;Wrox.Beginning.PHP5.Apache.and.MySQL.Web.Development&lt;br /&gt;Apache Cookbook&lt;br /&gt;Php And Mysql For Dummies&lt;br /&gt;PHP.Cookbook&lt;br /&gt;Spring.into.PHP.5&lt;br /&gt;Sams.MySQL.3rd.Edition.Mar.2005.eBook-LiB&lt;br /&gt;MySQL.Essential.Skills.eBook-LiB&lt;br /&gt;MySQL_Cookbook&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;上面就是建站所用到了，到后来你可以看看关于网络安全方面的&lt;br /&gt;Linux.Security.Cookbook&lt;br /&gt;Apache.Security&lt;br /&gt;Practical.Unix.And.Internet.Security.3rd.Edition&lt;br /&gt;Hack Proofing Linux（推荐一下这本书，此书要求动手较强）&lt;br /&gt;系统性地讲解  建IDS及FIREWAIL&lt;br /&gt;Syngress.Snort.2.1.Intrusion.Detection.Second.Edition&lt;br /&gt;Sams - Linux Firewalls 3rd&lt;br /&gt;&lt;br /&gt;通过上面的学习应该学习一下建DNS，及MTA了，这个人觉得比 建 LAMP环境要困难一点儿，但是很适用啊&lt;br /&gt;建议看&lt;br /&gt;OReilly DNS and BIND 5th(2006)&lt;br /&gt;Pro.DNS.and.BIND&lt;br /&gt;MTA（你可以理解成服务器）最好不要去学习sendmail了因为不但配置比较难而且现在已经有点儿过时了。&lt;br /&gt;建议学习qmail,postfix&lt;br /&gt;可以看一下：&lt;br /&gt;oreilly_postfix_the_definitive_guide&lt;br /&gt;&lt;br /&gt;建议好先学习玩dns再来学习MTA，要不很多东西会让人很头痛。&lt;br /&gt;&lt;br /&gt;如果要想学习一下Proxy 建议看&lt;br /&gt;Squid.The.Definitive.Guide&lt;br /&gt;&lt;br /&gt;编程：我学习UNIX其实最初的原因就是因为其开源，自己可以看其原码而明白很多其上面的编程方法&lt;br /&gt;&lt;br /&gt;建议：不要忘记shell&lt;br /&gt;shell 在很多人眼里面只是脚本，总觉得能完成的事情不多，但是想是通过前面的学习已经看到了其重要性&lt;br /&gt;所以想系统性地学习一下可以看看：&lt;br /&gt;Regular.Expression.Pocket.Reference&lt;br /&gt;Linux shell&lt;br /&gt;Linux Shell scrīpting With Bash&lt;br /&gt;OReilly.Learning.the.bash.Shell&lt;br /&gt;Sams Publishing - unix shell programming ed3&lt;br /&gt;&lt;br /&gt;系统编程我先推荐一本《unix环境高级编程 第二版》看其他书的时候把把这本看完了先，注意要看第二版，第一版到现在已经有十多年了，很多标准与现在已经不相同了。&lt;br /&gt;此书叫做unix编程圣经级别的，相信我没错的。&lt;br /&gt;这本目录已经有中文版的，不过建议看原版。&lt;br /&gt;&lt;br /&gt;网络编程：&lt;br /&gt;UNIX Network Programming Volume 1  3rd Ed&lt;br /&gt;&lt;br /&gt;编译内核：&lt;br /&gt;Understanding.The.Linux.Kernel.3Ed&lt;br /&gt;&lt;br /&gt;当然书这么多，不可能每一本都看，大家可以选择性地看看，相信对于学习很有帮助。&lt;br /&gt;我也是这样过来的。&lt;br /&gt;&lt;br /&gt;以上都是自己的一些平时学习的一些总结，可能没有什么条理。&lt;br /&gt;但希望对于大家学习有所帮助。&lt;br /&gt;&lt;br /&gt;几个好网站：&lt;br /&gt;鸟哥的linux私房菜:http://linux.vbird.org/ &lt;br /&gt;中国linux:http://linux.chinaunix.org &lt;br /&gt;LAMP大全：http://www.lamp9.cn&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-4723203427449656054?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/4723203427449656054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/03/linux-shelllampdnsmailproxyprogrammingi.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/4723203427449656054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/4723203427449656054'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/03/linux-shelllampdnsmailproxyprogrammingi.html' title='LINUX 学习方法、书籍：shell+LAMP+dns+mail+proxy+programming+IDS+filewall+Kernel (转)'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-67641534302749664</id><published>2010-03-11T03:44:00.000-08:00</published><updated>2010-03-11T03:45:13.800-08:00</updated><title type='text'>Linux Study(转)</title><content type='html'>假设你是计算机科班出身，计算机系的基本课程如数据结构、操作系统、体系结构、编译原理、计算机网络你全修过&lt;br /&gt;我想大概可以分为4个阶段，水平从低到高&lt;br /&gt;从安装使用=&gt;linux常用命令=&gt;linux系统编程=&gt;内核开发阅读内核源码&lt;br /&gt;linux常用命令要学会自己编译内核，优化系统，调整参数。安装和常用命令书太多了，找本稍微详细点的就ok，其间需要学会正则表达式&lt;br /&gt;系统编程推荐《高级unix环境编程》，黑话叫APUE，还有《unix网络编程》。这时候大概还需要看资料理解elf文件格式，连接器和加载器，cmu的一本教材中文名为《深入理解计算机系统》比较好&lt;br /&gt;内核开发阅读内核源码阶段，从写驱动入手逐渐深入linux内核开发&lt;br /&gt;参考书如下《linux device drivers》，黑话叫ldd&lt;br /&gt;《linux kernel development》，黑话叫lkd&lt;br /&gt;《understading the linux kernel》，黑话叫utlk&lt;br /&gt;《linux源码情景分析》&lt;br /&gt;这四本书为搞内核的必读书籍&lt;br /&gt;最后，第三阶段和第四阶段最重动手，空言无益，光看书也不罩，不动手那些东西理解不了。&lt;br /&gt; &lt;br /&gt;学习linux/unix编程方法的建议&lt;br /&gt;建议学习路径：&lt;br /&gt;首先先学学编辑器，vim, emacs什么的都行。&lt;br /&gt;然后学make file文件，只要知道一点就行，这样就可以准备编程序了。&lt;br /&gt;然后看看《C程序设计语言》K&amp;R，这样呢，基本上就可以进行一般的编程了，顺便找本数据结构的书来看。&lt;br /&gt;如果想学习UNIX/LINUX的编程，《APUE》绝对经典的教材，加深一下功底，学习《UNP》的第二卷。这样基本上系统方面的就可以掌握了。&lt;br /&gt;然后再看Douglus E. Comer的《用TCP/IP进行网际互连》第一卷，学习一下网络的知识，再看《UNP》的第一卷，不仅学习网络编程，而且对系统编程的一些常用的技巧就很熟悉了，如果继续网络编程，建议看《TCP/IP进行网际互连》的第三卷，里面有很多关于应用协议telnet、ftp等协议的编程。&lt;br /&gt;如果想写设备驱动程序，首先您的系统编程的接口比如文件、IPC等必须要熟知了，再学习《LDD》2。&lt;br /&gt; &lt;br /&gt;对于几本经典教材的评价：&lt;br /&gt;《The C Programing Language》K&amp;R 经典的C语言程序设计教材，作者是C语言的发明者，教材内容深入浅出。虽然有点老，但是必备的一本手册，现在有时候我还常翻翻。篇幅比较小，但是每看一遍，就有一遍的收获。另外也可用谭浩强的《C语言程序设计》代替。&lt;br /&gt;《Advanced Programing in Unix Envirement》 W.Richard Stevens：也是非常经典的书（废话，Stevens的书哪有不经典的！），虽然初学者就可以看，但是事实上它是《Unix Network Programing》的一本辅助资料。国内的翻译的《UNIX环境高级编程》的水平不怎么样，现在有影印版，直接读英文比读中文来得容易。&lt;br /&gt;　　《Unix Network Programing》W.Richard Stevens：第一卷讲BSD Socket网络编程接口和另外一种网络编程接口的，不过现在一般都用BSD Socket，所以这本书只要看大约一半多就可以了。第二卷没有设计到网络的东西，主要讲进程间通讯和Posix线程。所以看了《APUE》以后，就可以看它了，基本上系统的东西就由《APUE》和《UNP》vol2概括了。看过《UNP》以后，您就会知道系统编程的绝大部分编程技巧，即使卷一是讲网络编程的。国内是清华翻译得《Unix网络编程》，翻译者得功底也比较高，翻译地比较好。所以建议还是看中文版。&lt;br /&gt;《TCP/IP祥解》一共三卷，卷一讲协议，卷二讲实现，卷三讲编程应用。我没有怎么看过，但是据说也很经典的，因为我没有时间看卷二，所以不便评价。&lt;br /&gt;《用TCP/IP进行网际互连》Douglus.E.Comer 一共三卷，卷一讲原理，卷二讲实现，卷三讲高级协议。感觉上这一套要比Stevens的那一套要好，就连Stevens也不得不承认它的第一卷非常经典。事实上，第一卷即使你没有一点网络的知识，看完以后也会对网络的来龙去脉了如指掌。第一卷中还有很多习题也设计得经典和实用，因为作者本身就是一位教师，并且卷一是国外研究生的教材。习题并没有答案，留给读者思考，因为问题得答案可以让你成为一个中级的Hacker，这些问题的答案可以象Douglus索取，不过只有他只给教师卷二我没有怎么看，卷三可以作为参考手册，其中地例子也很经典。如果您看过Qterm的源代码，就会知道Qterm的telnet 实现部分大多数就是从这本书的源代码过来的。对于网络原理的书，我推荐它，而不是Stevens的《TCP/IP祥解》。&lt;br /&gt;　　《Operating System - Design and Implement》这个是讲操作系统的书，用Minix做的例子。作者母语不是英文，所以英文看起来比较晦涩。国内翻译的是《操作系统设计与实现》，我没看过中文版，因为翻译者是尤晋元，他翻译的《APUE》已经让我失望头顶了。读了这本书，对操作系统的底层怎么工作的就会有一个清晰的认识。&lt;br /&gt;　　《Linux Device Driver》2e ，为数不多的关于Linux设备驱动程序的好书。不过内容有些杂乱，如果您没有一些写驱动的经验，初次看会有些摸不着南北。国内翻译的是《Linux设备驱动程序》第二版，第一版，第二版的译者我都有很深的接触，不过总体上来说，虽然第二版翻译的有些不尽人意，但是相比第一版来说已经超出了一大截。要读这一本书，至少应该先找一些《计算机原理》《计算机体系结构》的书来马马虎虎读读，至少应该对硬件和计算机的工作过程有一些了解。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-67641534302749664?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/67641534302749664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/03/linux-study.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/67641534302749664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/67641534302749664'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/03/linux-study.html' title='Linux Study(转)'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-4657463062684797430</id><published>2010-03-11T01:31:00.000-08:00</published><updated>2010-03-11T01:32:31.986-08:00</updated><title type='text'>self 的用法</title><content type='html'>关于什么时间用self. , 其实是和Obj-c的存取方法有关, 不过网上很多人也都这么解答的, 那它为什么和存取方法有关? 怎么有关的? 并没有多少人回答出来. 同时关于内存管理的内容, 请大家看旺财勇士的Objective-C内存管理总结～CC专版 , 有些东西我就不多解释了.&lt;br /&gt;    进入正题, 我们经常会在官方文档里看到这样的代码:&lt;br /&gt;MyClass.h&lt;br /&gt;[lang=objc][/lang]&lt;br /&gt;@interface MyClass : NSObject {&lt;br /&gt;    MyObject *myObject;&lt;br /&gt;}&lt;br /&gt;@property (nonatomic, retain) MyObject *myObject;&lt;br /&gt;@end&lt;br /&gt;[/lang]&lt;br /&gt;MyClass.m&lt;br /&gt;[lang=objc]&lt;br /&gt;@synthesize myObject;&lt;br /&gt;&lt;br /&gt;-(id)init{&lt;br /&gt;    if(self = [super init]){&lt;br /&gt;        MyObject * aMyObject = [[MyObject alloc] init];&lt;br /&gt;        self.myObject = aMyObject;&lt;br /&gt;        [aMyObject release];&lt;br /&gt;    }&lt;br /&gt;    return self;&lt;br /&gt;}[/lang]&lt;br /&gt;有人就问, 为什么要这么复杂的赋值? 为什么要加self. ? 直接写成self.myObject = [[MyObject alloc] init];不是也没有错么? 不加self有时好像也是正常的?&lt;br /&gt;&lt;br /&gt;现在我们来看看内存管理的内容:&lt;br /&gt;&lt;br /&gt;先看间接赋值的:&lt;br /&gt;    1.加self.:&lt;br /&gt;[lang=objc]&lt;br /&gt;        MyObject * aMyObject = [[MyObject alloc] init]; //aMyObject retainCount = 1;&lt;br /&gt;        self.myObject = aMyObject; //myObject retainCount = 2;&lt;br /&gt;        [aMyObject release];//myObject retainCount = 1;&lt;br /&gt;[/lang]&lt;br /&gt;    2. 不加self.:&lt;br /&gt;[lang=objc]&lt;br /&gt;       MyObject * aMyObject = [[MyObject alloc] init]; //aMyObject retainCount = 1;&lt;br /&gt;        myObject = aMyObject; //myObject retainCount = 1;&lt;br /&gt;        [aMyObject release];//对象己经被释放 &lt;br /&gt;[/lang]&lt;br /&gt;再看直接赋值的:&lt;br /&gt;    3.加self.:&lt;br /&gt;[lang=objc]&lt;br /&gt;        self.myObject = [[MyObject alloc] init]; //myObject retainCount = 2;&lt;br /&gt;[/lang]&lt;br /&gt;    4. 不加self.:&lt;br /&gt;[lang=objc]&lt;br /&gt;        myObject = [[MyObject alloc] init]; //myObject retainCount = 1;&lt;br /&gt;[/lang]&lt;br /&gt;现在是不是有点晕, 我们先来把代码改一下, 官方的一种常见写法: &lt;br /&gt;&lt;br /&gt;MyClass.h&lt;br /&gt;[lang=objc]&lt;br /&gt;@interface MyClass : NSObject {&lt;br /&gt;    MyObject * _myObject;&lt;br /&gt;}&lt;br /&gt;@property (nonatomic, retain) MyObject *myObject;&lt;br /&gt;@end&lt;br /&gt;[/lang]&lt;br /&gt;MyClass.m&lt;br /&gt;[lang=objc]&lt;br /&gt;@synthesize myObject = _myObject;&lt;br /&gt;[/lang]&lt;br /&gt;OK, 你现在再试下, 如果你用self._myObject = aMyObject; 或者 myObject = aMyObject; 你会得到一个错误, 为什么呢, 这里就是和Obj-c的存取方法有关了. 说白了很简单 , 大家都知道, @property (nonatomic, retain) MyObject *myObject; 是为一个属性设置存取方法, 只是平时我们用的方法名和属性名是一样的,现在你把它写成不同的名字, 就会很清楚了. _myObject是属性本身, myObject是存取方法名.&lt;br /&gt;&lt;br /&gt;现在我们知道self.是访问属性的存取方法了, 那存取方法又怎么工作的? self.myObject = [[MyObject alloc] init]; 为什么会有内存泄露?&lt;br /&gt;关于nonatomic我不多解释了, 它不是我要讲的重点, 而且我也没完全搞清楚, 不误导大家. 我只说assign, retain ,copy. &lt;br /&gt;get方法是: &lt;br /&gt;[lang=objc]&lt;br /&gt;-(MyObject*)myObject{&lt;br /&gt;    return _myObject;&lt;br /&gt;}&lt;br /&gt;[/lang]&lt;br /&gt;Set方法是: &lt;br /&gt;[lang=objc]&lt;br /&gt;// assign &lt;br /&gt;-(void)setMyObject:(id)newValue{&lt;br /&gt;    _myObject = newValue; &lt;br /&gt;}&lt;br /&gt;// retain &lt;br /&gt;-(void)setMyObject:(id)newValue{&lt;br /&gt;    if (_myObject != newValue) { &lt;br /&gt;        [_myObject release]; &lt;br /&gt;        _myObject = [newValue retain]; &lt;br /&gt;    }  &lt;br /&gt;}&lt;br /&gt;// copy &lt;br /&gt;-(void)setMyObject:(id)newValue{&lt;br /&gt;    if (_myObject != newValue) { &lt;br /&gt;        [_myObject release]; &lt;br /&gt;        _myObject = [newValue copy]; &lt;br /&gt;    } &lt;br /&gt;}&lt;br /&gt;[/lang]&lt;br /&gt;其实这些方法里还有别的内容, 并不只是这些. 而且这些方法可以被重写. 比如你写一个&lt;br /&gt;[lang=objc]&lt;br /&gt;-(MyObject*)myObject{&lt;br /&gt;    &lt;br /&gt;    return _myObject;&lt;br /&gt;}&lt;br /&gt;[/lang]&lt;br /&gt;放在你的类里, 你调用self.myObject时(不要把它放在等号左边, 那会调用get方法)就会调用这个方法.&lt;br /&gt;&lt;br /&gt;这里多说一句, @property 是为你设置存取方法, 和你的属性无关, 你可以只写一句&lt;br /&gt;[lang=objc]&lt;br /&gt;@property (readonly) NSString *name;&lt;br /&gt; [/lang]&lt;br /&gt;在你的类里实现&lt;br /&gt;[lang=objc]&lt;br /&gt;-(NSString*)name{&lt;br /&gt;    NSLog(@"name");&lt;br /&gt;    return @"MyClass";&lt;br /&gt;}&lt;br /&gt;[/lang]&lt;br /&gt;同样可以用self.name调用.&lt;br /&gt;&lt;br /&gt;现在回头说说我们开始的那四个赋值, 当不用self.的时候,  那句话只是一般的赋值, 把一个指针赋给另一个指针, 不会对分配的内存有任何影响, 所以2中不要最后[aMyObject release];这句话和4是一回事. 这里就不多说了.我们看看1和3, &lt;br /&gt;当调用setMyObject:方法时, 对newValue 做了一次retain操作, 我们必须把原来的newValue释放掉, 不然就会内存泄露, 在1里, 我们有个aMyObject可以用来释放, 在3里, 我们无法释放它, 所以, 在3里, 我们会多出来一个retainCount. 内存泄露了.&lt;br /&gt;&lt;br /&gt;说了这么多, 我只想让大家清楚, 什么是调用属性本身, 什么是调用存取方法. 怎么样才能避免内存泄露, 而且, 以上例子里是在自己类里的调用, 如果这个类被别的类调用时, 更要注意一些, &lt;br /&gt;&lt;br /&gt;顺便说一下, 如果你想在其它类访问对象属性, 而不是通过存取方法, 你可以用myClass -&gt; myObject来访问, 这样是直接访问对象本身, 不过你先要把myObject设成@public. 但这个是官方不提倡的,&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-4657463062684797430?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/4657463062684797430/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/03/self.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/4657463062684797430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/4657463062684797430'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/03/self.html' title='self 的用法'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-1048458540161739834</id><published>2010-03-10T06:54:00.001-08:00</published><updated>2010-03-10T06:54:28.957-08:00</updated><title type='text'>金融学习（转）</title><content type='html'>1．学习&lt;br /&gt;（1）入门书籍：&lt; Finance &gt;, Zvi Bodie, Robert C. Merton，框架非常清晰&lt;br /&gt;（2）中级教材a． Investments：&lt; Essentials of Investments &gt;, Zvi Bodie, Alex Kane, Alan J. Marcus.&lt; Investments &gt;, William F.Sharpe, Gordon J.Alexander, Jeffrey V.Bailey第一本书行文更流畅易懂，第二本较学术化，但两者选一即可。在阅读时不但应该学习规范市场的运作，更应该想想中国市场到底因为哪些原因使得如此的无效率。在理论和实际中反复的来来回回，可以使人更好的理解两者。b. Corporate Finance&lt; Principles of Corporate Finance &gt;, Richard A.Brealey, Stewart C.Myers&lt; Corporate Finance &gt;, Stephen A. Ross, Randolph W. Westerfield, Jeffrey F. Jaffe第一本通俗些，例子写的非常漂亮，第二本学术化色彩较浓，也是两者选一即可。需要了解简单的会计知识，仅借贷和资产负债表等基础即可。c. Derivatives&lt; Options, Futures and other Derivatives &gt;, John C. Hull如果简单的了解，a中任何一本书相关的部分就足够了。&lt;br /&gt;（3）数理化的教材&lt; The Econometrics of Financial Markets &gt;，John Y. Campbell, Andrew W. Lo, A.Craig MacKinlay全面介绍了金融学中常用的计量方法。&lt;br /&gt;&lt;br /&gt;2．研究&lt;br /&gt;（1）了解理论发展脉络掌握了经济学基本工具（建模、计量），再有金融学相关的知识，就应该开始做研究了。强烈推荐在这一阶段先看下面这本金融思想史方面的书：&lt; Capital Ideas : the Improbable Origins of Modern Wall Street &gt;, Peter L. Bernstein.此书用一个个扣人心弦的故事，简洁、流畅而完整的叙述了金融理论是如何随着金融市场的发展而成长起来的，启迪初学者如何观察现象、发现问题、简化变量，完美的展示了金融市场奔腾不息的力量和金融理论的深邃迷人的美感。&lt;br /&gt;（2）专题研究：从问题入手在学习理论的时候，总会发现一些既有理论难以解释的问题，顺着这些问题展开研究，阅读相关的书籍、论文，和同学、师长以及有实践经验的人讨论，这样对理论的理解比较深，能够看到理论是如何抽象实际的，假设是如何决定结论的。强烈反对先划定一个领域，看完一本“经典”教科书后再看另一本“经典”，不断预备知识的学习方式，因为知识是永远“预备”不完的，即使“预备”完毕了，也很可能只会在一个框架下思考，丧失了发现问题的能力。研究的时候要把思路放宽，尽量早的去和同学师长讨论，一个人冥思苦想很可能在一个死结上纠缠，他人的建议、经验和相关资源能够帮你打开思路。例如，自己当时想解释为什么中国的小股民明知权利得不到保护也要持有股票，由于开始读的都是教科书，而这些书都是基于Efficient Market Hypothesis (EMH)的，自己改什么风险偏好的效用函数、设定投资机会限制，不是结论不对，就是太牵强，总让自己很不舒服。直到有一天和一个师兄讨论，他建议我去看看行为金融（Behavior Finance）方面的资料，我才发现自己已经太久的被束缚在EMH里，而且浑然不觉。（建议阅读：&lt; Inefficient markets : an introduction to behavioral finance&gt;，Andrei Shleifer）&lt;br /&gt;（3）保持开放的思想，研究新的领域在一个领域做久了，总会习惯思考相关的问题，虽然我们的确需要在某个领域沉淀很久才会有所贡献，但不能在不知不觉中限制自己思考的领域。建议时常浏览如下网页看看现在的研究在做什么：Journal of Finance: http://www.afajof.org/Journal of Financal Economics : http://jfe.rochester.edu/jfe.htmNBER :www.nber.org正式发表的文章已经比较慢了，有时间应该去各大名校金融系的网页上去看working paper.&lt;br /&gt;（4）网络资源统计年报：http://www.gse.pku.edu.cn/dataset/index.htm中国资讯行：http://www.bjinfobank.com国外数据：www.economagic.comwww.economy.com/freelunch&lt;br /&gt;&lt;br /&gt;()实务&lt;br /&gt;&lt;br /&gt;资源学习和研究的努力可以保证一个人在学校取得较有意义的研究成果，但是很现实的，绝大部分人都需要到社会上来工作，承担自己的责任。因此，了解现实的情况，知道一些被理论滤去但却在实践中非常重要的变量是很重要的，下面的一些资源可供参考。&lt;br /&gt;&lt;br /&gt;1．书籍&lt;br /&gt;&lt;br /&gt;（1） 历史部分&lt; Manias, Panics, and Crashes : a History of Financial Crises &gt;，Charles P. Kindleberger金融危机是金融市场永恒的话题，而且历史不断的上演同样的故事。&lt; The House of Morgan: An American Banking Dynasty and the Rise of Modern Finance &gt;，Chernow, Ron（中译本：《摩根财团：美国一代银行王朝和现代金融业的崛起》，金立群校译，中国财政经济出版社）&lt; Wriston : Walter Wriston, Citibank and the Rise and Fall of American Financial Supremacy &gt;，Phillip L. Zweig.（中译本：《沃尔特瑞斯顿与花旗银行：美国金融霸权的兴衰》，海南出版社）每一个金融巨子都是时代的产物，看看他们如何把握历史时机，如何面对巨大的危难。《胡雪岩》（高阳）了解中国社会的商业环境。&lt;br /&gt;（2）投资部分&lt; One up on Wall Street : how to use what you already know to make money in the market &gt;, Peter Lynch with John Rothchild强调基本面分析，对生活的观察，Peter Lynch的其他书也可以。&lt; The Alchemy of finance : reading the mind of the market &gt; or&lt; Open society : reforming global capitalism &gt;，George Soros（中译本：《金融炼金术》，海南出版社；《开放社会: 改革全球资本主义》商务印书馆）阅读其中任一本都可以了解索罗斯的思想，只是第一本书后一部分非常技术性。个人认为其书有价值之处在于用解析主义的方法论分析金融市场，在书中称其为反身性，这是与经济学实证主义本质上不同的思维方式。&lt; Valuation : measuring and managing the value of companies &gt; McKinsey &amp; Company, Inc, Tom Copeland, Tim Koller, Jack Murrin.介绍了实用的估值方法&lt;br /&gt;（3）银行《日本金融败战》，(日)竹内宏著，彭晋璋译，中国发展出版社 1999一个精彩的案例，反思了大而不强的日本银行的困境和错误的改革思路。《复合萧条论：泡沫经济的经济对策》，(日)宫崎义一，陆华生译，中国人民大学出版社2000介绍了日本80年代泡沫经济产生、发展和破灭的全过程，对于正在走向金融自由化的中国有重要借鉴意义。&lt; The Bank Credit Analysis Handbook : a guide for analysts, bankers and investors &gt;, Jonathan Golin对银行较为全面的评估手册。&lt; Microeconomics of Banking &gt;, Xavier Freixas, Jean-Charles Rochet&lt; FinancialIntermedraices &gt;, Mervyn K.Lewis对银行的经济学分析，很好的学术性书籍。&lt;br /&gt;&lt;br /&gt;2.网络资源推荐了很多国外网站，毕竟我们是在一个急速全球化的时代之中。&lt;br /&gt;&lt;br /&gt;杂志：&lt;br /&gt;&lt;br /&gt;《财经》 ：http://www.caijing.com.cn/（国内最好的财经期刊）&lt;br /&gt;《比较》 ：http://www.bijiao.org(学术性，收费)&lt;br /&gt;Financial Analysts Journal : http://www.aimrpubs.org/faj/home.htmlTime：http://www.time.comEconomist : http://www.economist.comBusiness Week : http://www.businessweek.com/(推荐订阅其免费新闻)Fortune : http://www.fortune.com/The Banker : http://www.thebanker.com/Foreign Affairs : http://www.foreignaffairs.org/&lt;br /&gt;&lt;br /&gt;报纸：&lt;br /&gt;《二十一世纪经济报导》：http://www.nanfangdaily.com.cn/jjFinancial Times :www.ft.com (15天免费)Wall Street Journal :www.wsj.com （14天免费）The New York Times : http://www.nytimes.com/(推荐订阅其免费新闻)&lt;br /&gt;&lt;br /&gt;机构：&lt;br /&gt;人民银行：http://www.pbc.gov.cn/&lt;br /&gt;银监会：http://www.cbrc.gov.cn/&lt;br /&gt;证监会：http://www.csrc.gov.cn&lt;br /&gt;保监会：http://www.circ.gov.cn/&lt;br /&gt;发改委：http://www.sdpc.gov.cn/&lt;br /&gt;财政部：http://www.mof.gov.cn&lt;br /&gt;国资委：http://www.sasac.gov.cn&lt;br /&gt;商务部：http://www.mofcom.gov.cn/&lt;br /&gt;国家统计局：http://www.stats.gov.cn/&lt;br /&gt;上交所：http://www.sse.com.cn&lt;br /&gt;深交所：http://www.szse.cn&lt;br /&gt;世界银行：http://www.worldbank.org/IMF : http://www.imf.org/&lt;br /&gt;美联储 : http://www.federalreserve.gov/&lt;br /&gt;欧洲央行 : http://www.ecb.intBank for International Settlements ：http://www.bis.org&lt;br /&gt;&lt;br /&gt;了解这些制定游戏规则的机构除了以上资源以外，还可以看一些涉及经济金融运作的电影，例如&lt; Wall Street &gt; （内幕*纵）、&lt; Other People’s Money &gt;（兼并重组）、《胡雪岩》（政治经济依存）等&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-1048458540161739834?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/1048458540161739834/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/03/blog-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/1048458540161739834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/1048458540161739834'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/03/blog-post.html' title='金融学习（转）'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-5885346675012438104</id><published>2010-03-10T01:20:00.001-08:00</published><updated>2010-03-10T01:20:41.872-08:00</updated><title type='text'>如何在你的应用程序中使用Openfeint (在线排行 成就系统 挑战功能) 《转》</title><content type='html'>游戏也好，程序也好，随着用户的增加，难免会有需要增加一个在线排行的功能，这样的好处有很多，比较特别的有两点。&lt;br /&gt;1. 不用考虑虚拟键盘调用后进行的用户名输入,我就是觉得做个虚拟键盘输入名字做rank让我很崩溃所以才出此“下策”&lt;br /&gt;2. 即时监控用户登录情况，随着每个用户的成绩提交，可以大致知道自己的游戏有多少用户。&lt;br /&gt;&lt;br /&gt;目前我们的选择有两个，一个是plus+ ，本来我想用它，因为我觉得plus+这个logo和颜色跟我的游戏内容比较合，奈何落花有意流水无情，我申请完等了一个星期后被他否掉 ，在这样半被迫的情况下，我选择了openfeint，并且深深为它的功能所折服，不敢专美，与各位有需要的朋友分享。&lt;br /&gt;&lt;br /&gt;注意，我这里说的情况是在原生程序中使用openfeint，u3d的引擎的不在我的讨论之列。另外我是web程序员出身，很多描述也许不够专业和精确，请各位指出及海涵。&lt;br /&gt;&lt;br /&gt;首先，在官网注册为开发者，建立一个项目，你会得到一个项目的client id（用于提问），一个产品编号跟一个密钥，这将放置于程序中，注意不要输错，我曾经因为少粘贴了一位密钥&lt;br /&gt;结果载入程序界面老是报莫名的错误。后来还是经过Fwish版主的提醒（他也曾经遇到一样的报错），才发现问题所在。&lt;br /&gt;在官网下载SDK，察看它包里的readme，注意看 Building OpenFeint With Your Project 部分&lt;br /&gt;一步一步照做，注意第九步 9. You must have a prefix header. It must have the following line: #import "OpenFeintPrefix.pch"&lt;br /&gt;这个是加在 项目名_Prefix.pch这个文件的最后就可以了。&lt;br /&gt;一般来说，编译出4000多个错的话，多半是这里没加。另外要将所有#import到openfeint头文件的.m文件的扩展名通通改为.mm，以实现objectC和C++的混合编译。&lt;br /&gt;&lt;br /&gt;完成以上步骤后，可以尝试编译一下，能够顺利编译就没有问题了。&lt;br /&gt;&lt;br /&gt;接下来要做的可以在openfeint附带的sample里面看到，它的sample写得还是比较仔细的，不过它用的是UIKit和nib文件，所以开发游戏的还要根据自己的引擎做一些修改。&lt;br /&gt;&lt;br /&gt;首先，在"项目名AppDelegate.mm"的文件里加入openfeint的载入定义部分，以让其在每次程序load完以后就起作用。&lt;br /&gt;- (void) startup &lt;br /&gt;{&lt;br /&gt;    ofDelegate = [MyOFDelegate new];&lt;br /&gt;    //ofNotificationDelegate = [SampleOFNotificationDelegate new];&lt;br /&gt;    //ofChallengeDelegate = [SampleOFChallengeDelegate new];&lt;br /&gt;    NSDictionary* settings = [NSDictionary dictionaryWithObjectsAndKeys:&lt;br /&gt;                              [NSNumber numberWithInt: UIDeviceOrientationPortrait], &lt;br /&gt;                              OpenFeintSettingDashboardOrientation,@"ArithMaster", &lt;br /&gt;                              OpenFeintSettingShortDisplayName,  &lt;br /&gt;                              [NSNumber numberWithBool:YES],&lt;br /&gt;                              OpenFeintSettingEnablePushNotifications,&lt;br /&gt;                              [NSNumber numberWithBool:NO], &lt;br /&gt;                              OpenFeintSettingDisableUserGeneratedContent,nil];&lt;br /&gt;    ofChallengeDelegate = [MyChallengeDelegate new];&lt;br /&gt;    OFDelegatesContainer* delegates = [OFDelegatesContainer containerWithOpenFeintDelegate:ofDelegate&lt;br /&gt;                                                                      andChallengeDelegate:ofChallengeDelegate &lt;br /&gt;                                                                   andNotificationDelegate:nil];&lt;br /&gt;    //OFDelegatesContainer* delegates = [OFDelegatesContainer containerWithOpenFeintDelegate:ofDelegate];&lt;br /&gt;    [OpenFeint initializeWithProductKey:@"这里输入key" &lt;br /&gt;                              andSecret:@"这里输入密钥"&lt;br /&gt;                         andDisplayName:@"Airthmetic Master"&lt;br /&gt;                            andSettings:settings    // see OpenFeintSettings.h&lt;br /&gt;                           andDelegates:delegates];              // see OFDelegatesContainer.h&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;代码中ofDelegate和ofChallengeDelegate两个代理分别对应于OF的启动以及challenge模式的启动。&lt;br /&gt;这两个类的具体写法可以参考sample中的例子，我基本上照抄了。&lt;br /&gt;&lt;br /&gt;这样做完以后，可以通过执行  [OpenFeint launchDashboard]来进入OF界面，官方文档中建议这个可以作为一个按钮的绑定方法来实现。&lt;br /&gt;&lt;br /&gt;另外重要的文档就在开发者界面里面指定功能里，点击问号会进入帮助界面，会告诉你功能相关头文件和基本的用法，注意调用方法的时候需要察看一下是否包含了带有该方法的头文件。&lt;br /&gt;&lt;br /&gt;接下来我说说怎么提交成绩，很简单，就一句 [OFHighScoreService setHighScore: score forLeaderboard:@"排行榜id" onSuccess:OFDelegate() onFailure:OFDelegate()];&lt;br /&gt;这个排行榜id是通过在leaderboard里面新建leaderboard取得的，在它的配置选项里可以选择成绩按照降序还是升序排列。一般都认为成绩是降序的，其实也不其然，比如我的《算术大师》，时间越短排行越高，就要按照升序排列。&lt;br /&gt;&lt;br /&gt;至于提交成就也就一句 [OFAchievementService unlockAchievement: @"成就id" onSuccess: OFDelegate() onFailure: OFDelegate()];&lt;br /&gt;这些成就可以在任何条件判断后执行，比如我指定了一个成就在成绩低于12秒的时候触发，就可以写 if(costsecond &lt; 12) 触发成就 ，可以放心的是在你解锁了该成就以后，再次达到成就触发条件也不会重复触发成就。&lt;br /&gt;&lt;br /&gt;以上两个都是OF的基本功能，使用也相对简单，我接下来要说的是高级功能里面的challenge，我为这个折腾了两个晚上，苦于资料稀缺，无人可问，终于攻克。&lt;br /&gt;challenge就是挑战功能，我的理解是它其实是一种延时对战机制，用户A在完成了指定的游戏以后，可以将游戏过程数据和结果打包传输到OF的服务器上，然后你的被挑战者从服务器上下载这些数据，以跟你同样的条件进行游戏，并且在最后跟你的游戏成绩比较，这样就完成了一次挑战的过程。大家或许也想到了，在《算术大师》里，这种机制跟游戏的相性天然吻合，我的实现是把“被挑战者下载数据以后做完题目跟挑战者比较”这个过程当成两个西部牛仔的对决，谁速度更快，谁就能够打落对方的帽子。OF的文档里提到，这个同样适用于赛车游戏的场合，挑战者的数据可以作为一辆幽灵车显示在被挑战者的画面中，可以想见，被挑战者更加不允许犯错，所以还是能够增加游戏的乐趣和对抗程度的。&lt;br /&gt;&lt;br /&gt;下面说说代码，首先是发送挑战，这个相对简单，直接上代码吧&lt;br /&gt;- (void)_sendChallenge&lt;br /&gt;{&lt;br /&gt;     ChallengeData  data;&lt;br /&gt;&lt;br /&gt;    data.score = score; //给挑战数据赋值&lt;br /&gt;&lt;br /&gt;    NSData* challengeData = [NSData dataWithBytes:(void const*)&amp;data length:sizeof(ChallengeData)];  //这句对我来说比较深奥了，只有敬畏地照抄了&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    [OFChallengeService &lt;br /&gt;     displaySendChallengeModal:@"挑战编号"&lt;br /&gt;     challengeText:[NSString stringWithFormat:@"my score is %d,come on!", score]&lt;br /&gt;     challengeData:challengeData];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;- (void)challenge:(id)sender{&lt;br /&gt;    &lt;br /&gt;    if ([OpenFeint hasUserApprovedFeint])&lt;br /&gt;    {&lt;br /&gt;        [self _sendChallenge];&lt;br /&gt;    }&lt;br /&gt;    else&lt;br /&gt;    {&lt;br /&gt;        OFDelegate nilDelegate;&lt;br /&gt;        OFDelegate sendChallengeDelegate(self, @selector(_sendChallenge));&lt;br /&gt;        [OpenFeint presentUserFeintApprovalModal:sendChallengeDelegate deniedDelegate:nilDelegate];&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;千万注意！根据我的实测，挑战数据似乎是C++的变量比较不会出问题，我用NSString,NSMutableString结果在打包上传，下载解包后变成了空值，我熬的两个晚上有一个多晚上都在搞这个，结果用了C++的数组，立马就没事情了，所以，可能打包进去的数据需要类似这样的处理data.leftnum=[leftnum objectAtIndex:i] intValue];&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;challenge的delegate，主要是在这个函数里处理&lt;br /&gt;- (void)userLaunchedChallenge:(OFChallengeToUser*)challengeToLaunch withChallengeData:(NSData*)challengeData&lt;br /&gt;前面一个参数里面有挑战的名称，用户等信息，后面一个NSData里面则是完整的游戏过程数据。&lt;br /&gt;这个只要按照sample里照做就可以了。设置完成后，用户在openfeint内接受挑战后将以这个delegate为入口进行后续的游戏过程处理。&lt;br /&gt;&lt;br /&gt;最后是挑战结果处理，一般就是写个方法判断输赢平，然后设置两个回调方法&lt;br /&gt;        OFDelegate success(self, @selector(_submittedCompletedChallenge));    &lt;br /&gt;        OFDelegate failure(self, @selector(_failedSubmittingCompletedChallenge));&lt;br /&gt;        [OFChallengeService &lt;br /&gt;         submitChallengeResult:challenge.resourceId&lt;br /&gt;         result:challenge.result &lt;br /&gt;         resultDescription:[NSString stringWithFormat:@"my score is %d,see you next time!", correctnum]&lt;br /&gt;         onSuccess:success &lt;br /&gt;         onFailure:failure];&lt;br /&gt;我建议在_submittedCompletedChallenge不要回传数据，似乎要按照传过来的数据的格式才行，否则会出错，而回传数据只有一种情况需要用到：就是被挑战者反复尝试挑战挑战者。&lt;br /&gt;&lt;br /&gt;challenge的适用大致就是如此了，不解的话，建议反复研究OF自带的sample，另外挑战模式的测试需要用户注册两个帐户通过在OF的界面下切换来调试，当然，一模拟器一设备是最理想的。&lt;br /&gt;&lt;br /&gt;有一些挑战相关的数据，都是可以从它传给delegate的两个参数里取得的，比如我在游戏里设置了一个成就，就是在"little Cocoa"发出的挑战中打败little Cocoa，则能获得游戏中最大的一个成就：超越开发者，这就需要判断传过来的用户名，通过对OF的源码的研究，我以这样的方式取得了用户名：[challenge.challenge.challenger name] ，当时觉得自己很牛逼，哈哈。&lt;br /&gt;&lt;br /&gt;以上大致就是我在使用openfeint过程中的一点心得，如果有问题的话请向我提出，如果知道的话，我会尽量解答。&lt;br /&gt;另外OF其实提供了很完备的社区功能，你可以在系统里面发布公告，跟你的用户通过游戏内置的论坛进行交流，发pm给你的用户，这些原本需要复杂代码实现的功能都已经由其替你实现。所以确实能够让你的游戏从一个单机游戏进入多人游戏的世界，从何在乐趣上进步一个台阶。&lt;br /&gt;最后我用一句xbox的口号结束这个教程，这也被写在了我游戏的loading页面：Game Experience may change during online play via openfeint !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-5885346675012438104?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/5885346675012438104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/03/openfeint.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5885346675012438104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5885346675012438104'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/03/openfeint.html' title='如何在你的应用程序中使用Openfeint (在线排行 成就系统 挑战功能) 《转》'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-628015990031946923</id><published>2010-03-08T15:49:00.001-08:00</published><updated>2010-03-08T15:49:36.408-08:00</updated><title type='text'>25 Ways to Promote an iPhone Application</title><content type='html'>Are you a programmer who developed an iPhone app which you think will be the next big hit in Apple’s iPhone App Store? If you are, you may already be thinking about how you can market the application that you developed. To help you out, here is a quick look at the top 25 ways that you can effectively market an iPhone application:&lt;br /&gt;&lt;br /&gt;1. Work on getting included in the list of the top 100 apps in the iPhone App Store.尽量争取进入app store的top 100。&lt;br /&gt;&lt;br /&gt;2. Make sure that you have a unique name for the iPhone app that you have so that your program will easily get noticed at the iPhone App Store itself, as well as in Google searches. Better yet, include your brand name when marketing the iPhone app that you developed.确保有个独一无二能引起苹果兴趣的应用名称，最好加上公司名或品牌名。&lt;br /&gt;&lt;br /&gt;3. Do your homework and check on what the competition has to offer. Make sure that the iPhone app that you have has a feature or characteristic that will make it stand out from the rest.要有自己的竞争优势才能脱颖而出。&lt;br /&gt;&lt;br /&gt;4. Publicize your iPhone app through profiling websites like AppShouter.com, AppStoreApps.com, AppSafari, AppRate and AppShopper.在苹果的应用推广网站上宣传自己的应用。&lt;br /&gt;&lt;br /&gt;5. Get your iPhone app included in the application review sites on the net.让你的应用出现在一些应用评测网站上。&lt;br /&gt;&lt;br /&gt;6. Create a fan page for your iPhone app on Facebook and promote the application from there.在Facebook上创建一个粉丝页面进行推广。&lt;br /&gt;&lt;br /&gt;7. In MySpace, use the bulletin features to send out mass bulletins to the subscribers of your page and any groups that you might have joined.运用MySpace的公告特色向你页面的订阅者以及可能加入的群发送大量公告。&lt;br /&gt;&lt;br /&gt;8. Create a blog and use it as a primary marketing tool for your iPhone app.创建一个博客，并将它作为主要的营销工具。&lt;br /&gt;&lt;br /&gt;9. Create a trial version of the iPhone app that you developed to test the waters before launching the product full-blast.在全面发行之前，先做一个测试版进行试水。&lt;br /&gt;&lt;br /&gt;10. Invest in buying a domain name for the iPhone app that you have to increase your rankings in Google’s natural search.投资性地为你的应用购买一个域名，这样可以上升google搜索里的排名。&lt;br /&gt;&lt;br /&gt;11. Work on your website – make sure that the web content is well-written, post clear screenshots and videos of exactly how the iPhone app can be used.建立好自己的网站，确保网页图文并茂，截图视频清晰可用。&lt;br /&gt;&lt;br /&gt;12. Use Google AdWords to get the word out and generate traffic to your site.使用google广告词能为你的网站带来流量。&lt;br /&gt;&lt;br /&gt;13. Focus your marketing strategy on the benefits that a mobile phone user can get to enjoy by taking advantage of your iPhone app. 关注使用者能从你的应用中获得什么。&lt;br /&gt;&lt;br /&gt;14. Once you have already conquered the US market, think about branching out to other markets like Germany, Australia and the UK – other countries which also have a huge number of iPhone users.一旦你占领美国市场，就可以考虑进入其他市场了，如德国，澳大利亚和英国，这些国家也有很多iphone使用者。&lt;br /&gt;&lt;br /&gt;15. Appropriately price the iPhone app that you developed.给你的应用定一个合适的价格。&lt;br /&gt;&lt;br /&gt;16. Have a press release written for your iPhone app and distribute it to highly targeted media outlets.让主流媒体为你的应用做一个新闻发布。&lt;br /&gt;&lt;br /&gt;17. Use the AddThis button to promote your iPhone app online for Facebook, MySpace, Digg, LinkedIn, Blogger and other similar sites. 在Facebook, MySpace, Digg, LinkedIn, Blogger等类似网站上做广告。&lt;br /&gt;&lt;br /&gt;18. Participate in online forums which are targeted towards the iPhone apps users.活跃于iphone应用使用者的论坛。&lt;br /&gt;&lt;br /&gt;19. Use e-mail marketing to send out highly targeted messages to prospect buyers.使用电子邮件对潜在买家进行推销。&lt;br /&gt;&lt;br /&gt;20. Twitter away! Make sure that within the iPhone app that you developed, there is a Twitter update feature so that you won’t be left behind with what the rest of the micro-blogging world is up to.使用twitter！&lt;br /&gt;&lt;br /&gt;21. In all the e-mail messages that you are sending out, make sure that there is a signature line contained in all of your e-mail messages.在你发出的邮件中确保每封都有签名档。&lt;br /&gt;&lt;br /&gt;22. Another popular website that you can use to promote your iPhone app is YouTube, where you can post a video of exactly how the program can be used.在YouTube上传视频。&lt;br /&gt;&lt;br /&gt;23. Submit an article about your iPhone app at sites like Digg.com which online users can Digg in turn.在Digg这类的网站上写关于你的应用的文章。&lt;br /&gt;&lt;br /&gt;24. Work with a business which has a similar market as yours which is not necessarily a direct competitor, so that your iPhone app together with their own brand can be promoted.与具有类似市场但无直接竞争关系的公司合作，这样能借他们的品牌推广你的应用。&lt;br /&gt;&lt;br /&gt;25. Expand your network through word of mouth by telling your friends, colleagues, neighbors and everybody else using an iPhone about just how awesome the application that you developed is!拓展人际网，告诉同事、朋友等人你的应用有多棒，充分发挥口头推荐的优势。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-628015990031946923?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/628015990031946923/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/03/25-ways-to-promote-iphone-application.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/628015990031946923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/628015990031946923'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/03/25-ways-to-promote-iphone-application.html' title='25 Ways to Promote an iPhone Application'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-7589573432733371483</id><published>2010-03-04T12:28:00.000-08:00</published><updated>2010-03-04T12:29:03.812-08:00</updated><title type='text'>NH, KDH 格式的文件转化为 pdf或者word格式的文件</title><content type='html'>方法一：&lt;br /&gt;首先到中国知网（www.cnki.net） 下载CAJViewer阅读器，安装CAJViewer阅读器软件。运行CAJViewer阅读器并点击“文件”打开.CAJ、.NH、.KDH等格式文 件。接下来选择“文件→打印”菜单，在打开的“打印”设置窗口中将“打印机”栏中的“名称”设置为“Microsoft Office Document Image Writer”，确认后将.CAJ、.NH、.KDH等格式文件输出为MDI格式的虚拟打印文件。&lt;br /&gt;&lt;br /&gt;（如果 你在“名称”设置的下拉列表中没有找到“Microsoft Office Document Image Writer”项，那证明你在安装Office 2003的时候没有安装该组件，请使用Office 2003安装光盘中的“添加/删除组件”更新安装该组件。）&lt;br /&gt;&lt;br /&gt;运行Microsoft Office Document Imaging，并利用它来打开刚才保存的MDI文件，选择“工具→将文本发送到Word”菜单，并在弹出的窗口中勾选“在输出时保持图片版式不变”，确 认后系统提示“必须在执行此操作前重新运行OCR。这可能需要一些时间”，不用管它，点确认即可。&lt;br /&gt;&lt;br /&gt;（目前，包括此工具在内的所有软件对PDF转DOC的识别率都不是特别完美，而且转换后会丢失原来的排版格式，所以大家在转换后还需要手工对其进行后期排版和校对工作。）&lt;br /&gt;&lt;br /&gt;方法二：&lt;br /&gt;首先用CAJViewer7.02版本阅读器打开nh文件，在你当前打开页的左上方有个保存为图片的按钮 &lt;br /&gt;&lt;br /&gt;， 把当前页面保存为图片。然后下载安装一个汉王6.0，安装好后打开。注意，此软件安装好后没有快捷方式，需要按照下面的步骤打开：开始--程序--汉王 ocr6.0--汉王ocr6.0.打开后按照下面的操作就可以识别图片，转换成文字。文件--打开图像--识别--开始识别--输出--到指定格式文 件，保存为txt文件就可以了。现在打开刚刚保存的文件，是不是看见文字转换好了！&lt;br /&gt;&lt;br /&gt;方法三：&lt;br /&gt;&lt;br /&gt;1、从CAJ格式的文件中提取文本前需要做好以下准备工作,安装CAJViewer7.02版的CAJ浏览器软件（系统中一定要有Office2003或者是office2007 办公软件） ；    2、从网上下载CAJ格式的资料文件保存到本地硬盘上。    3、启动CAJViewer浏览器程序，用CAJViewer7.02打开刚才保存的CAJ格式的文件。    4、（1）用CAJViewer7.02打开caj 文件；（2）单击“选择图像”按钮，然后在每页的左右两边分区域选取文字（如图：红色区域内）；（3）再在选取区域内，单击右键，右键选击“文字识別”。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-7589573432733371483?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/7589573432733371483/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/03/nh-kdh-pdfword.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/7589573432733371483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/7589573432733371483'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/03/nh-kdh-pdfword.html' title='NH, KDH 格式的文件转化为 pdf或者word格式的文件'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-6262722025854263856</id><published>2010-03-04T09:40:00.000-08:00</published><updated>2010-03-04T09:41:13.321-08:00</updated><title type='text'>Dlog of Objective-C</title><content type='html'>// Prefix header for all source files of the 'Avego' target in the 'Avego' project&lt;br /&gt;//&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#import &lt;Availability.h&gt;&lt;br /&gt;&lt;br /&gt;#ifndef __IPHONE_3_0&lt;br /&gt;#warning "This project uses features only available in iPhone SDK 3.0 and later."&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;#ifdef DEBUG  &lt;br /&gt;#   define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);  &lt;br /&gt;#else  &lt;br /&gt;#   define DLog(...)  &lt;br /&gt;#endif  &lt;br /&gt;&lt;br /&gt;#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);  &lt;br /&gt;&lt;br /&gt;#ifdef __OBJC__&lt;br /&gt;    #import &lt;Foundation/Foundation.h&gt;&lt;br /&gt;    #import &lt;UIKit/UIKit.h&gt;&lt;br /&gt;    #import &lt;CoreData/CoreData.h&gt;&lt;br /&gt;#endif&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-6262722025854263856?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/6262722025854263856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/03/dlog-of-objective-c.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/6262722025854263856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/6262722025854263856'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/03/dlog-of-objective-c.html' title='Dlog of Objective-C'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-8899688920955629258</id><published>2010-03-04T09:36:00.000-08:00</published><updated>2010-03-04T09:38:53.129-08:00</updated><title type='text'>Multiple Arguments Objective-C</title><content type='html'>Side note: The @ symbol at the front of @”Testing” string is convenience method that converts the given string to an NSString object, which in the case of the setStr method, is the required type for the parameter.&lt;br /&gt;&lt;br /&gt;Multiple Arguments&lt;br /&gt;Taking this another step further, we can pass multiple arguments along with our message. The message below takes three arguments, a string, date and integer. Sometimes it easier to read the method aloud to get this jist of what’s up. In this case, “pass a message to the ptr receiver that sets a string, and a date and an integer.”&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; [ptr setStr:@"A new test..." andDate:[NSDate date] andInteger:99];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Here is how we define the message in the interface file:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;-(void) setStr:(NSString *)str andDate:(NSDate *)date andInteger:(int)x;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And here is the implementation of the setStr() method which accepts three arguments:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;-(void) setStr:(NSString *)strInput andDate:(NSDate *)dateInput&lt;br /&gt;    andInteger:(int)xInput&lt;br /&gt;{&lt;br /&gt;  [self setStr:strInput];&lt;br /&gt;  [self setDate:dateInput];&lt;br /&gt;  [self setX:xInput];&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-8899688920955629258?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/8899688920955629258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/03/multiple-arguments-objective-c.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/8899688920955629258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/8899688920955629258'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/03/multiple-arguments-objective-c.html' title='Multiple Arguments Objective-C'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-5895456159144457702</id><published>2010-02-26T07:49:00.000-08:00</published><updated>2010-02-26T07:52:58.864-08:00</updated><title type='text'>C++  Vector</title><content type='html'>vector&lt; int &gt; ivec( 10, -1 );&lt;br /&gt;定义了 ivec 它包含十个 int 型的元素 每个元素都被初始化为-1&lt;br /&gt;&lt;br /&gt;// 把ia的6个元素拷贝到ivec中 &lt;br /&gt;vector&lt; int &gt; ivec( ia, ia+6 );&lt;br /&gt;可以将 vector 初始化为一个已有数组的全部或一部分 只需指定希望被用来初始化 vector 的数组的开始地址以及数组最末元素的下一位置来实现 &lt;br /&gt;&lt;br /&gt;//拷贝3个元素 ia[2],ia[3],ia[4] &lt;br /&gt;vector&lt; int &gt; ivec( &amp;ia[ 2 ], &amp;ia[ 5 ] );&lt;br /&gt;&lt;br /&gt;与内置数组不同 vector 可以被另一个 vector 初始化 或被赋给另一个 vector &lt;br /&gt;例如 vector&lt; string &gt; svec;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;vector&lt; string &gt; svec;&lt;br /&gt;&lt;br /&gt;void init_and_assign()&lt;br /&gt;{&lt;br /&gt;        // 用另一个 vector 初始化一个 &lt;br /&gt;        vector vector&lt; string &gt; user_names( svec );&lt;br /&gt;         // ...&lt;br /&gt;        // 把一个 vector 拷贝给另一个 &lt;br /&gt;        vector svec = user_names;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-5895456159144457702?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/5895456159144457702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/02/c-vector.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5895456159144457702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5895456159144457702'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/02/c-vector.html' title='C++  Vector'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-462239960415821572</id><published>2010-02-25T04:28:00.001-08:00</published><updated>2010-02-25T04:30:28.568-08:00</updated><title type='text'>C++ 标准 STL(Standard Template Library)</title><content type='html'>在C++标准中，STL被组织为下面的13个头文件：&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;algorithm, deque, functional, iterator, &lt;br /&gt;vector, list, map, memory, numeric, &lt;br /&gt;queue, set, stack和utility&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-462239960415821572?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/462239960415821572/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/02/c-stlstandard-template-library.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/462239960415821572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/462239960415821572'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/02/c-stlstandard-template-library.html' title='C++ 标准 STL(Standard Template Library)'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-5149658800434460694</id><published>2010-02-25T03:27:00.001-08:00</published><updated>2010-02-25T03:27:55.584-08:00</updated><title type='text'>C++ 引用和指针的区别</title><content type='html'>指针和引用有两个主要区别 引用必须总是指向一个对象 如果用一个引用给另一个引 用赋值 那么改变的是被引用的对象而不是引用本身 让我们来看几个例子 当我们这样写&lt;br /&gt;int *pi = 0;&lt;br /&gt;用 0 初始化 pi——即 pi 当前不指向任何对象 但当我们写如下语句时 const int &amp;ri = 0;&lt;br /&gt;在内部 发生了以下转换&lt;br /&gt;int temp = 0; const int &amp;ri = temp;&lt;br /&gt;引用之间的赋值是第二个不同 当给定了以下代码后&lt;br /&gt;int ival = 1024, ival2 = 2048; int *pi = &amp;ival, *pi2 = &amp;ival2;&lt;br /&gt;我们再写如下语句&lt;br /&gt;pi = pi2;&lt;br /&gt;pi 指向的对象 ival 并没有被改变 实际上 pi 被赋值为指向 pi2 所指的对象——在本例中 即 ival2 重要的是 现在 pi 和 pi2 都指向同一对象 这是一个重要的错误源 如果我们把 一个类对象拷贝给另一个类对象 而该类有一个或多个成员是指针 我们将在第 14 章详细讨 论这个问题&lt;br /&gt;但是 假定有下列代码&lt;br /&gt;int &amp;ri = ival, &amp;ri2 = ival2;&lt;br /&gt;当我们写出这样的赋值语句时&lt;br /&gt;ri = ri2;&lt;br /&gt;改变的是 ival&lt;br /&gt;而不是引用本身 赋值之后 两个引用仍然指向原来的对象 实际的 C++程序很少使用指向独立对象的引用类型 引用类型主要被用作函数的形式参数&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-5149658800434460694?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/5149658800434460694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/02/c.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5149658800434460694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5149658800434460694'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/02/c.html' title='C++ 引用和指针的区别'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-8657244411500910428</id><published>2010-02-23T07:55:00.000-08:00</published><updated>2010-02-23T07:57:48.243-08:00</updated><title type='text'>Drawing with NSBezierPath</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fAv06gZ6FPU/S4P690T0nZI/AAAAAAAAAIQ/YLEEdONCfWc/s1600-h/Screen+shot+2010-02-23+at+15.55.40.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 316px;" src="http://1.bp.blogspot.com/_fAv06gZ6FPU/S4P690T0nZI/AAAAAAAAAIQ/YLEEdONCfWc/s400/Screen+shot+2010-02-23+at+15.55.40.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5441468714714439058" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;@interface StretchView : NSView {&lt;br /&gt; NSBezierPath *path;&lt;br /&gt;}&lt;br /&gt;- (NSPoint)randomPoint;&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;br /&gt;@implementation StretchView&lt;br /&gt;&lt;br /&gt;- (id)initWithFrame:(NSRect)frame {&lt;br /&gt;    if (![super initWithFrame:frame]) &lt;br /&gt;  return nil;&lt;br /&gt; &lt;br /&gt; srandom(time(NULL));&lt;br /&gt; &lt;br /&gt; path = [[NSBezierPath alloc] init];&lt;br /&gt; [path setLineWidth:3.0];&lt;br /&gt; NSPoint p = [self randomPoint];&lt;br /&gt; [path moveToPoint:p];&lt;br /&gt; int i;&lt;br /&gt;    for (i = 0; i &lt; 15; i++) {&lt;br /&gt;  p = [self randomPoint];&lt;br /&gt;  [path lineToPoint:p];&lt;br /&gt; }&lt;br /&gt; [path closePath];&lt;br /&gt; return self;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (void)dealloc&lt;br /&gt;{&lt;br /&gt; [path release];&lt;br /&gt; [super dealloc];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (NSPoint)randomPoint&lt;br /&gt;{&lt;br /&gt; NSRect bounds = [self bounds];&lt;br /&gt; NSPoint result;&lt;br /&gt; result.x = bounds.origin.x + random() % (int)bounds.size.width;&lt;br /&gt; result.y = bounds.origin.y + random() % (int)bounds.size.height;&lt;br /&gt; return result;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (void)drawRect:(NSRect)rect {&lt;br /&gt; NSRect bounds = [self bounds];&lt;br /&gt; [[NSColor greenColor] set];&lt;br /&gt; [NSBezierPath fillRect:bounds];&lt;br /&gt; &lt;br /&gt; [[NSColor whiteColor] set];&lt;br /&gt; [path fill];&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-8657244411500910428?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/8657244411500910428/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/02/drawing-with-nsbezierpath.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/8657244411500910428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/8657244411500910428'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/02/drawing-with-nsbezierpath.html' title='Drawing with NSBezierPath'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_fAv06gZ6FPU/S4P690T0nZI/AAAAAAAAAIQ/YLEEdONCfWc/s72-c/Screen+shot+2010-02-23+at+15.55.40.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-4545864585385032722</id><published>2010-02-18T02:21:00.000-08:00</published><updated>2010-03-08T07:17:50.458-08:00</updated><title type='text'>logging in iPhone Applications</title><content type='html'>&lt;span style="font-style: italic; font-family: arial;font-size:85%;" &gt;&lt;pre&gt;&lt;br /&gt;NSData *dataToWrite = [[NSString stringWithString:@"String to write"] dataUsingEncoding:NSUTF8StringEncoding];&lt;br /&gt;&lt;br /&gt;NSString *docsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];&lt;br /&gt;NSString *path = [docsDirectory stringByAppendingPathComponent:@"fileName.txt"];&lt;br /&gt;&lt;br /&gt;// Write the file&lt;br /&gt;[dataToWrite writeToFile:path atomically:YES];&lt;br /&gt;&lt;br /&gt;// Read the file&lt;br /&gt;NSString *stringFromFile = [[NSString alloc] initWithContentsOfFile:path]; &lt;br /&gt;&lt;br /&gt;// Check if file exists&lt;br /&gt;NSFileManager *fileManager = [NSFileManager defaultManager];&lt;br /&gt;[fileManager fileExistsAtPath:path]; // Returns a BOOL   &lt;br /&gt;&lt;br /&gt;// Remove the file&lt;br /&gt;[fileManager removeItemAtPath:path error:NULL];&lt;br /&gt;&lt;br /&gt;// Cleanup&lt;br /&gt;[stringFromFile release];&lt;br /&gt;[fileManager release];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;White log into the log-file&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;+ (void)logGenenalInfo:(NSString *)data {&lt;br /&gt; NSString *docsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];&lt;br /&gt; NSString *path = [docsDirectory stringByAppendingPathComponent:@"GeneralFile.txt"];&lt;br /&gt; &lt;br /&gt; // Check if file exists&lt;br /&gt; NSFileManager *fileManager = [NSFileManager defaultManager];&lt;br /&gt; if ([fileManager fileExistsAtPath:path]) {&lt;br /&gt;  // Read the file&lt;br /&gt;  NSString *stringFromFile = [[NSString alloc] initWithContentsOfFile:path];&lt;br /&gt;  data = [stringFromFile stringByAppendingFormat:@" %@",data];&lt;br /&gt; }&lt;br /&gt; NSData *dataToWrite = [data dataUsingEncoding:NSUTF8StringEncoding];&lt;br /&gt; // Write the file&lt;br /&gt; [dataToWrite writeToFile:path atomically:YES];&lt;br /&gt; [fileManager release];&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Clean the Log&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;+ (void)cleanAllLog {&lt;br /&gt; NSFileManager *fileManager = [NSFileManager defaultManager];&lt;br /&gt; &lt;br /&gt; NSString *docsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];&lt;br /&gt; NSString *gePath = [docsDirectory stringByAppendingPathComponent:@"GeneralFile.txt"];&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; // Check if file exists then Remove the file&lt;br /&gt; if ([fileManager fileExistsAtPath:gePath]) // Returns a BOOL    &lt;br /&gt;  [fileManager removeItemAtPath:gePath error:NULL];&lt;br /&gt; &lt;br /&gt; [fileManager release];&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Get the program information&lt;br /&gt;&lt;br /&gt;DateTime\tMessage\tData\tfileNameAndLineNumber&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;[LogFileHelper logGenenalInfo:&lt;br /&gt;[NSString stringWithFormat:@"function %s, line %d \n"&lt;br /&gt;,__FUNCTION__,__LINE__]];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-4545864585385032722?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/4545864585385032722/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/02/logging-in-iphone-applications.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/4545864585385032722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/4545864585385032722'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/02/logging-in-iphone-applications.html' title='logging in iPhone Applications'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-3291828092358456670</id><published>2010-02-16T06:55:00.000-08:00</published><updated>2010-02-16T06:56:15.647-08:00</updated><title type='text'>iPhone-format</title><content type='html'>&lt;pre&gt;&lt;br /&gt;-(NSString*) formatCurrencyValue:(double)value&lt;br /&gt;{&lt;br /&gt;  NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];&lt;br /&gt;  [numberFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];&lt;br /&gt;  [numberFormatter setCurrencySymbol:@"$"];&lt;br /&gt;  [numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];&lt;br /&gt;  NSNumber *c = [NSNumber numberWithFloat:value];&lt;br /&gt;  return [numberFormatter stringFromNumber:c];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-(NSString*) formatPercentValue:(double)value&lt;br /&gt;{&lt;br /&gt;  NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];&lt;br /&gt;  [numberFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];&lt;br /&gt;  [numberFormatter setPercentSymbol:@"%"];&lt;br /&gt;  [numberFormatter setNumberStyle: NSNumberFormatterPercentStyle];&lt;br /&gt;  [numberFormatter setDecimalSeparator:@"."];&lt;br /&gt;  [numberFormatter setGeneratesDecimalNumbers:TRUE];&lt;br /&gt;  [numberFormatter setMinimumFractionDigits:2];&lt;br /&gt;  [numberFormatter setRoundingMode: NSNumberFormatterRoundUp];&lt;br /&gt;  [numberFormatter setRoundingIncrement:[[NSNumber alloc]initWithDouble:0.05]];&lt;br /&gt;  NSNumber *c = [NSNumber numberWithFloat:value];&lt;br /&gt;  return [numberFormatter stringFromNumber:c];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-(double) formatDoubleFromCurrency:(NSString*)value&lt;br /&gt;{&lt;br /&gt;  double ret ;&lt;br /&gt;  if(value)&lt;br /&gt;  {&lt;br /&gt;    ret = [value doubleValue];&lt;br /&gt;    if (ret == 0)&lt;br /&gt;     {&lt;br /&gt;      NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];&lt;br /&gt;      [numberFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];&lt;br /&gt;      [numberFormatter setCurrencySymbol:@"$"];&lt;br /&gt;      [numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];&lt;br /&gt;      NSNumber *c = [numberFormatter numberFromString:value];&lt;br /&gt;      ret = [c doubleValue];&lt;br /&gt;     }&lt;br /&gt;     return ret;&lt;br /&gt;  }&lt;br /&gt;  else&lt;br /&gt;    return 0.0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-3291828092358456670?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/3291828092358456670/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/02/iphone-format.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/3291828092358456670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/3291828092358456670'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/02/iphone-format.html' title='iPhone-format'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-8857625994703949867</id><published>2010-02-16T06:53:00.000-08:00</published><updated>2010-03-01T03:07:01.365-08:00</updated><title type='text'>Password Encryption</title><content type='html'>&lt;pre&gt;&lt;br /&gt;#import &lt;UIKit/UIKit.h&gt;&lt;br /&gt;&lt;br /&gt;@interface Encryption : NSObject {&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;+ (NSString *) md5: (NSString *) plainText;&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#import "Encryption.h"&lt;br /&gt;#import &lt;CommonCrypto/CommonDigest.h&gt;&lt;br /&gt;&lt;br /&gt;@implementation Encryption&lt;br /&gt;&lt;br /&gt;+ (NSString *) md5: (NSString *) plainText {&lt;br /&gt; const char *cStr = [plainText UTF8String];&lt;br /&gt; unsigned char result[CC_MD5_DIGEST_LENGTH];&lt;br /&gt; CC_MD5(cStr, strlen(cStr), result);&lt;br /&gt; &lt;br /&gt; return [[NSString stringWithFormat: @"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",&lt;br /&gt;    result[0], result[1], result[2], result[3],&lt;br /&gt;    result[4], result[5], result[6], result[7],&lt;br /&gt;    result[8], result[9], result[10], result[11],&lt;br /&gt;    result[12], result[13], result[14], result[15]&lt;br /&gt;    ] lowercaseString];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;+(NSString*)fileMD5:(NSString*)path&lt;br /&gt;{&lt;br /&gt;    NSFileHandle *handle = [NSFileHandle fileHandleForReadingAtPath:path];&lt;br /&gt;    if( handle== nil ) return @"ERROR GETTING FILE MD5"; // file didnt exist&lt;br /&gt; &lt;br /&gt;    CC_MD5_CTX md5;&lt;br /&gt; &lt;br /&gt;    CC_MD5_Init(&amp;md5);&lt;br /&gt; &lt;br /&gt;    BOOL done = NO;&lt;br /&gt;    while(!done)&lt;br /&gt;    {&lt;br /&gt;        NSData* fileData = [handle readDataOfLength: CHUNK_SIZE ];&lt;br /&gt;        CC_MD5_Update(&amp;md5, [fileData bytes], [fileData length]);&lt;br /&gt;        if( [fileData length] == 0 ) done = YES;&lt;br /&gt;    }&lt;br /&gt;    unsigned char digest[CC_MD5_DIGEST_LENGTH];&lt;br /&gt;    CC_MD5_Final(digest, &amp;md5);&lt;br /&gt;    NSString* s = [NSString stringWithFormat: @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",&lt;br /&gt;                   digest[0], digest[1], &lt;br /&gt;                   digest[2], digest[3],&lt;br /&gt;                   digest[4], digest[5],&lt;br /&gt;                   digest[6], digest[7],&lt;br /&gt;                   digest[8], digest[9],&lt;br /&gt;                   digest[10], digest[11],&lt;br /&gt;                   digest[12], digest[13],&lt;br /&gt;                   digest[14], digest[15]];&lt;br /&gt;    return s;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-8857625994703949867?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/8857625994703949867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/02/password-encryption.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/8857625994703949867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/8857625994703949867'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/02/password-encryption.html' title='Password Encryption'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-3747190110593586236</id><published>2010-02-15T02:11:00.000-08:00</published><updated>2010-02-15T02:12:13.151-08:00</updated><title type='text'>IPHONE APP 真正的全局变量</title><content type='html'>真正牛B 的全局变量是 定义在 main（）里面的。。。。&lt;br /&gt;可以直接用。。。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-3747190110593586236?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/3747190110593586236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/02/iphone-app.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/3747190110593586236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/3747190110593586236'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/02/iphone-app.html' title='IPHONE APP 真正的全局变量'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-2227331173849982567</id><published>2010-02-09T03:59:00.000-08:00</published><updated>2010-02-09T04:00:37.358-08:00</updated><title type='text'>iPhone-country code and iPhone locale settings</title><content type='html'>March 19, 2009 — praveenmatanam&lt;br /&gt;&lt;br /&gt;    NSLocale *locale = [NSLocale currentLocale];&lt;br /&gt;    NSString *countryCode = [locale objectForKey: NSLocaleCountryCode];&lt;br /&gt;   &lt;br /&gt;    NSString *countryName = [locale displayNameForKey: NSLocaleCountryCode&lt;br /&gt;                                                                             value: countryCode]];&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-2227331173849982567?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/2227331173849982567/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/02/iphone-country-code-and-iphone-locale.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/2227331173849982567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/2227331173849982567'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/02/iphone-country-code-and-iphone-locale.html' title='iPhone-country code and iPhone locale settings'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-5291298994011591621</id><published>2010-02-07T16:14:00.001-08:00</published><updated>2010-02-07T16:14:46.639-08:00</updated><title type='text'>Process status</title><content type='html'>ps -ax -o user,pid,vsz,rss,command&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;USER       PID      VSZ    RSS COMMAND&lt;br /&gt;root         1  2456680   1048 /sbin/launchd&lt;br /&gt;root        10  2448264   2564 /usr/libexec/kextd&lt;br /&gt;root        11  2444540    736 /usr/sbin/notifyd&lt;br /&gt;root        12  2446808   1440 /usr/sbin/diskarbitrationd&lt;br /&gt;root        13  2462636   3164 /usr/libexec/configd&lt;br /&gt;root        14  2457096    852 /usr/sbin/syslogd&lt;br /&gt;root        15  2452816   5012 /usr/sbin/DirectoryService&lt;br /&gt;daemon      16  2446660   1596 /usr/sbin/distnoted&lt;br /&gt;root        18  2459016   2452 /usr/sbin/cupsd -l&lt;br /&gt;_usbmuxd    20  2460984   2024 /System/Library/PrivateFrameworks/MobileDevice.f&lt;br /&gt;root        21  2446688   1008 /sbin/SystemStarter&lt;br /&gt;root        24  2459344   3560 /usr/sbin/securityd -i&lt;br /&gt;root        27  2809672 137060 /System/Library/Frameworks/CoreServices.framewor&lt;br /&gt;_mdnsresponder    28  2459704   2376 /usr/sbin/mDNSResponder -launchd&lt;br /&gt;ming        29  2777832  11236 /System/Library/CoreServices/loginwindow.app/Con&lt;br /&gt;root        30  2445744    992 /usr/sbin/KernelEventAgent&lt;br /&gt;root        32  2447564   2064 /usr/libexec/hidd&lt;br /&gt;root        33  2464044   2560 /System/Library/Frameworks/CoreServices.framewor&lt;br /&gt;root        35  2434784    788 /sbin/dynamic_pager -F /private/var/vm/swapfile&lt;br /&gt;root        40  2461604   4260 /usr/sbin/blued&lt;br /&gt;root        41  2445648    936 autofsd&lt;br /&gt;root        45   105636   2792 /Library/Application Support/iStat Server/iStatS&lt;br /&gt;root        49  2492500  27688 /System/Library/CoreServices/coreservicesd&lt;br /&gt;_windowserver    60  2900984 110808 /System/Library/Frameworks/ApplicationServices.f&lt;br /&gt;root        74    81940    444 /Library/Application Support/VMware Fusion/vmnet&lt;br /&gt;root        80    81536    296 /Library/Application Support/VMware Fusion/vmnet&lt;br /&gt;root        82    77668    176 /Library/Application Support/VMware Fusion/vmnet&lt;br /&gt;root        85    77668    176 /Library/Application Support/VMware Fusion/vmnet&lt;br /&gt;root        88    81536    288 /Library/Application Support/VMware Fusion/vmnet&lt;br /&gt;root        90    88520    500 /Library/Application Support/VMware Fusion/vmnet&lt;br /&gt;root        93  2438116    848 /System/Library/Frameworks/OpenGL.framework/Vers&lt;br /&gt;_coreaudiod   104  2453356   6160 /usr/sbin/coreaudiod&lt;br /&gt;ming       109  2456228   1100 /sbin/launchd&lt;br /&gt;ming       113  2946424  22388 /System/Library/CoreServices/Dock.app/Contents/M&lt;br /&gt;ming       114  2782252  20648 /System/Library/CoreServices/SystemUIServer.app/&lt;br /&gt;ming       115  3109228  59456 /System/Library/CoreServices/Finder.app/Contents&lt;br /&gt;ming       119  2435928    836 /usr/sbin/pboard&lt;br /&gt;ming       122  2507916   5176 /System/Library/Frameworks/ApplicationServices.f&lt;br /&gt;ming       127  2462084   1964 /System/Library/Frameworks/InputMethodKit.framew&lt;br /&gt;ming       130  2725340   5648 /usr/libexec/UserEventAgent -l Aqua&lt;br /&gt;ming       136  2447976   1644 /System/Library/CoreServices/AirPort Base Statio&lt;br /&gt;ming       143  2727672   4876 /Applications/iTunes.app/Contents/Resources/iTun&lt;br /&gt;ming       146   382580   2352 /Library/PreferencePanes/Microsoft Mouse.prefPan&lt;br /&gt;ming       148   433900   7896 /Library/PreferencePanes/MaxMenus.prefPane/Conte&lt;br /&gt;ming       149   387344   3768 /Users/ming/Library/Application Support/RealNetw&lt;br /&gt;ming       150   502728  63288 /Applications/Dropbox.app/Contents/MacOS/Dropbox&lt;br /&gt;root       153    98728  13328 /Users/ming/Library/Application Support/RealNetw&lt;br /&gt;ming       157  2755412   7724 /System/Library/Image Capture/Support/Image Capt&lt;br /&gt;ming       169   493260  15104 /Library/PreferencePanes/Growl.prefPane/Contents&lt;br /&gt;root       186   602372   1432 /Applications/Dropbox.app/Contents/Resources/dbf&lt;br /&gt;ming       191  2468332   9020 /System/Library/Services/AppleSpell.service/Cont&lt;br /&gt;ming       208  2891412 299268 /System/Library/Frameworks/CoreServices.framewor&lt;br /&gt;ming       319  2860440  38044 /System/Library/Input Methods/SCIM.app/Contents/&lt;br /&gt;ming       367  2181412 341968 /Applications/Firefox.app/Contents/MacOS/firefox&lt;br /&gt;ming       395   602576  94244 /Applications/Microsoft Office 2008/Microsoft Po&lt;br /&gt;ming       398   424872   7724 /Applications/Microsoft Office 2008/Office/Micro&lt;br /&gt;ming       400   368980   2116 /Library/Application Support/Microsoft/MAU2.0/Mi&lt;br /&gt;ming       523   634040  47896 /Applications/iTunes.app/Contents/MacOS/iTunes -&lt;br /&gt;ming       524   110844   9796 /System/Library/PrivateFrameworks/MobileDevice.f&lt;br /&gt;ming       725 11324624  83240 /Developer/Applications/Xcode.app/Contents/MacOS&lt;br /&gt;ming       954  2864280  15080 /Applications/Utilities/Terminal.app/Contents/Ma&lt;br /&gt;ming      1360  2855608  49036 /Applications/Mail.app/Contents/MacOS/Mail -psn_&lt;br /&gt;ming      1458  2458404   1412 /usr/bin/ssh-agent -l&lt;br /&gt;ming      1692   501360  14980 /Applications/TextWrangler.app/Contents/MacOS/Te&lt;br /&gt;ming      1695   101004    956 /Applications/TextWrangler.app/Contents/Helpers/&lt;br /&gt;ming      2381  2775268  24184 /Applications/iCal.app/Contents/MacOS/iCal -psn_&lt;br /&gt;ming      2403  3033012  94076 /Applications/Preview.app/Contents/MacOS/Preview&lt;br /&gt;_lp       4284  2467040  32676 Brother_HL_2170W_series 7 ming 1-02 Session 101 &lt;br /&gt;root      4285  2435912    840 mdns://Brother%20HL-2170W%20series._pdl-datastre&lt;br /&gt;ming      4294   691276  73032 /Applications/QQ.app/Contents/MacOS/QQ -psn_0_99&lt;br /&gt;root      4538  2436056   1588 login -pf ming&lt;br /&gt;ming      4539  2435468   1092 -bash&lt;br /&gt;root      5099  2434788    516 ps -ax -o user,pid,vsz,rss,command&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-5291298994011591621?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/5291298994011591621/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/02/process-status.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5291298994011591621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5291298994011591621'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/02/process-status.html' title='Process status'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-5776292177245157064</id><published>2010-02-02T06:57:00.000-08:00</published><updated>2010-02-02T06:58:24.764-08:00</updated><title type='text'>Play sound</title><content type='html'>&lt;pre&gt;&lt;br /&gt;#import &lt;UIKit/UIKit.h&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;@interface CSSound : NSObject {&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;+(void)playSound:(NSString *)soundName;&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#import "CSSound.h"&lt;br /&gt;#import &lt;AudioToolbox/AudioServices.h&gt;&lt;br /&gt;&lt;br /&gt;@implementation CSSound&lt;br /&gt;+(void)playSound:(NSString *)soundName{&lt;br /&gt; SystemSoundID mySSID;&lt;br /&gt; NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingString:soundName];&lt;br /&gt; &lt;br /&gt; OSStatus error = AudioServicesCreateSystemSoundID( (CFURLRef)[NSURL fileURLWithPath:path], &amp;mySSID);&lt;br /&gt; &lt;br /&gt; if(error == kAudioServicesNoError){&lt;br /&gt;  //DLog(@"successfully contructed sound %@", soundName);&lt;br /&gt;  AudioServicesPlaySystemSound(mySSID);&lt;br /&gt; }else{&lt;br /&gt;  DLog(@"error playing sound %@", soundName);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-5776292177245157064?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/5776292177245157064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/02/play-sound.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5776292177245157064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5776292177245157064'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/02/play-sound.html' title='Play sound'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-6160326067569601405</id><published>2010-02-01T04:34:00.000-08:00</published><updated>2010-02-01T04:42:18.562-08:00</updated><title type='text'>gcc Unix&amp;Mac OS program (3. Predefined macros)</title><content type='html'>__APPLE__                     : Defined for an Apple Platform, such as OS X.&lt;br /&gt;__APPLE_CC__              : This is an integer value representing the version of the compiler.&lt;br /&gt;__OBJC__                       : Defined if the compiler is compiling in Objective-C mode&lt;br /&gt;__cplusplus                  : Defined if the compiler is compiling in C++ mode.&lt;br /&gt;__MACH__                     : Defined if the Mach system calls are available&lt;br /&gt;__DATE__                      : The current date&lt;br /&gt;__TIME__                       : The current time  &lt;br /&gt;__FILE__                         : The name of file&lt;br /&gt;__LINE__                        : The line number of the file&lt;br /&gt;__FUNCTION__             : The name of the function r Objective-C method being compiled&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;// predef.m -- play with predefined macros&lt;br /&gt;&lt;br /&gt;/* compile with&lt;br /&gt;cc -g -Wall -o predef -framework Foundation predef.m&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#import &lt;Foundation/Foundation.h&gt;&lt;br /&gt;#import &lt;stdio.h&gt;&lt;br /&gt;&lt;br /&gt;void someFunc (void)&lt;br /&gt;{&lt;br /&gt;    printf ("file %s, line %d, function %s\n", __FILE__, __LINE__, __FUNCTION__);&lt;br /&gt;} // someFunc&lt;br /&gt;&lt;br /&gt;@interface SomeClass : NSObject { } &lt;br /&gt;+ (void) someMethod;&lt;br /&gt;@end&lt;br /&gt;&lt;br /&gt;@implementation SomeClass&lt;br /&gt;+ (void) someMethod&lt;br /&gt;{&lt;br /&gt;    printf ("file %s, line %d, function %s\n", __FILE__, __LINE__, __FUNCTION__);&lt;br /&gt;} // someMethod&lt;br /&gt;@end&lt;br /&gt;&lt;br /&gt;int main (int argc, char *argv[])&lt;br /&gt;{&lt;br /&gt;    printf ("__APPLE__: %d,  __APPLE_CC__: %d\n",&lt;br /&gt;     __APPLE__, __APPLE_CC__);&lt;br /&gt;    printf ("today is %s, the time is %s\n", __DATE__, __TIME__);&lt;br /&gt;    printf ("file %s, line %d, function %s\n", __FILE__, __LINE__, __FUNCTION__);&lt;br /&gt;    someFunc ();&lt;br /&gt;    [SomeClass someMethod];&lt;br /&gt;    return (0);&lt;br /&gt;} // main&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;cc -g -Wall -o predef -framework Foundation predef.m &lt;br /&gt;&lt;br /&gt;./predef&lt;br /&gt;&lt;br /&gt;__APPLE__: 1,  __APPLE_CC__: 5657&lt;br /&gt;today is Feb  1 2010, the time is 12:32:23&lt;br /&gt;file predef.m, line 32, function main&lt;br /&gt;file predef.m, line 13, function someFunc&lt;br /&gt;file predef.m, line 23, function +[SomeClass someMethod]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-6160326067569601405?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/6160326067569601405/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/02/gcc-unix-os-program-3-predefined-macros.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/6160326067569601405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/6160326067569601405'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/02/gcc-unix-os-program-3-predefined-macros.html' title='gcc Unix&amp;Mac OS program (3. Predefined macros)'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-1096630256228038012</id><published>2010-02-01T04:27:00.000-08:00</published><updated>2010-02-01T04:28:38.554-08:00</updated><title type='text'>gcc Unix&amp;Mac OS program (2. assemble resulting file)</title><content type='html'>cc -g -Wall -S XXXX.m&lt;br /&gt;&lt;br /&gt;cc -o xxxx xxxx.s&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-1096630256228038012?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/1096630256228038012/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/02/gcc-unix-os-program-2-assemble.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/1096630256228038012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/1096630256228038012'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/02/gcc-unix-os-program-2-assemble.html' title='gcc Unix&amp;Mac OS program (2. assemble resulting file)'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-3069823611229649109</id><published>2010-02-01T03:54:00.000-08:00</published><updated>2010-02-01T04:27:21.919-08:00</updated><title type='text'>gcc Unix&amp;Mac OS program (1. Warning)</title><content type='html'>&lt;pre&gt;&lt;br /&gt;int main (int arg, char *argv)&lt;br /&gt;{&lt;br /&gt; int i;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;terminal command: cc -Wall -o warning warning.m&lt;br /&gt;&lt;br /&gt;warning.m:2: warning: second argument of ‘main’ should be ‘char **’&lt;br /&gt;warning.m: In function ‘main’:&lt;br /&gt;warning.m:3: warning: unused variable ‘i’&lt;br /&gt;warning.m:4: warning: control reaches end of non-void function&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt; * cc - Wall -Wno-unused warning.m   (turn that unused warning off)&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt; * cc -Wunused warning.m   (only see unused warning mistakes)&lt;br /&gt; */&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-3069823611229649109?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/3069823611229649109/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/02/gcc-unix-os-program.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/3069823611229649109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/3069823611229649109'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/02/gcc-unix-os-program.html' title='gcc Unix&amp;Mac OS program (1. Warning)'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-3146583303293815572</id><published>2010-01-29T03:42:00.000-08:00</published><updated>2010-01-29T09:10:29.898-08:00</updated><title type='text'>SVN address change Operation</title><content type='html'>svn info&lt;br /&gt;svn stat&lt;br /&gt;&lt;br /&gt;vi /etc/hosts&lt;br /&gt;&lt;br /&gt;find . -name entries | xargs perl -pi -e 's/older-IP/New-IP/&lt;br /&gt;&lt;br /&gt;svn switch --relocate svn://MingZ@10.0.1.136 svn://MingZ@dublin-svn&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-3146583303293815572?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/3146583303293815572/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/01/svn-address-change-operation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/3146583303293815572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/3146583303293815572'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/01/svn-address-change-operation.html' title='SVN address change Operation'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-5691524638996072296</id><published>2010-01-28T14:15:00.001-08:00</published><updated>2010-01-28T14:17:20.720-08:00</updated><title type='text'>HOW TO DISPLAY PHONE NUMBER(IPHONE)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fAv06gZ6FPU/S2IMm_wapDI/AAAAAAAAAII/8WOHTd7CWpw/s1600-h/Screen+shot+2010-01-28+at+22.14.31.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 325px; height: 266px;" src="http://2.bp.blogspot.com/_fAv06gZ6FPU/S2IMm_wapDI/AAAAAAAAAII/8WOHTd7CWpw/s400/Screen+shot+2010-01-28+at+22.14.31.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5431917964651308082" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;[[NSUserDefaults standardUserDefaults] valueForKey:@"SBFormattedPhoneNumber"];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Don't forget set Phone-number in your iPhone's setting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-5691524638996072296?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/5691524638996072296/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/01/how-to-display-phone-numberiphone.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5691524638996072296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5691524638996072296'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/01/how-to-display-phone-numberiphone.html' title='HOW TO DISPLAY PHONE NUMBER(IPHONE)'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_fAv06gZ6FPU/S2IMm_wapDI/AAAAAAAAAII/8WOHTd7CWpw/s72-c/Screen+shot+2010-01-28+at+22.14.31.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-4149589679373887519</id><published>2010-01-23T11:29:00.000-08:00</published><updated>2010-01-23T11:32:42.069-08:00</updated><title type='text'>Linux(Ubuntu) set password of Root</title><content type='html'>After Ubuntu be installed, the password of root is "NULL"，Since you did not set password&lt;br /&gt;for root，However your first user account was admin "User" ，So you can login your first User and set password for root , so ...&lt;br /&gt;&lt;br /&gt;sudo passwd root&lt;br /&gt;[sudo] password for you ：---&gt; input your password&lt;br /&gt;Enter new UNIX password: --- &gt; Set password for root &lt;br /&gt;Retype new UNIX password: --&gt; Reset&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-4149589679373887519?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/4149589679373887519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/01/linuxubuntu-set-password-of-root.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/4149589679373887519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/4149589679373887519'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/01/linuxubuntu-set-password-of-root.html' title='Linux(Ubuntu) set password of Root'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-2507024971852291792</id><published>2010-01-08T08:35:00.000-08:00</published><updated>2010-01-08T08:37:52.774-08:00</updated><title type='text'>problem of "[super dealloc]"</title><content type='html'>&lt;pre&gt;&lt;br /&gt;- (void)dealloc {&lt;br /&gt;   [super dealloc];  &lt;br /&gt;   [a release];&lt;br /&gt;   [b release];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;- (void)dealloc {&lt;br /&gt;    [a release];&lt;br /&gt;    [b release];&lt;br /&gt;    [super dealloc];&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;What's the difference between them?&lt;br /&gt;&lt;br /&gt;If a or b extends super!!!!!  [super dealloc] at front will lead problems&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-2507024971852291792?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/2507024971852291792/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2010/01/problem-of-super-dealloc.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/2507024971852291792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/2507024971852291792'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2010/01/problem-of-super-dealloc.html' title='problem of &quot;[super dealloc]&quot;'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-5919358418985854512</id><published>2009-12-29T14:59:00.000-08:00</published><updated>2009-12-29T15:01:57.952-08:00</updated><title type='text'>Program Running Time Comparisons</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fAv06gZ6FPU/SzqKTTxmY5I/AAAAAAAAAIA/Pytm7otvCf4/s1600-h/Screen+shot+2009-12-29+at+23.01.07.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 203px;" src="http://4.bp.blogspot.com/_fAv06gZ6FPU/SzqKTTxmY5I/AAAAAAAAAIA/Pytm7otvCf4/s400/Screen+shot+2009-12-29+at+23.01.07.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5420797165824271250" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-5919358418985854512?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/5919358418985854512/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/12/program-running-time-comparisons.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5919358418985854512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5919358418985854512'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/12/program-running-time-comparisons.html' title='Program Running Time Comparisons'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_fAv06gZ6FPU/SzqKTTxmY5I/AAAAAAAAAIA/Pytm7otvCf4/s72-c/Screen+shot+2009-12-29+at+23.01.07.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-922376258899996772</id><published>2009-12-28T09:46:00.000-08:00</published><updated>2009-12-28T09:47:40.064-08:00</updated><title type='text'>C++ 预定义内容</title><content type='html'>编译 C++程序时 编译器自动定义了一个预处理器名字__cplusplus 注意前面有两个下 划线 因此 我们可以根据它来判断该程序是否是 C++程序 以便有条件地包含一些代码 例如&lt;br /&gt;#ifdef __cplusplus&lt;br /&gt;我们要编译 C++ // extern "C" 到第 7 章再解释&lt;br /&gt;extern "C" #endif&lt;br /&gt;int min( int, int );&lt;br /&gt;在编译标准 C 时 编译器将自动定义名字__STDC__ &lt;br /&gt;当然 __cplusplus 与__STDC__ 不会同时被定义&lt;br /&gt;示为 08:17:05 Oct 31 1996&lt;br /&gt;// 不错&lt;br /&gt;另外两个比较有用的预定义名字是 __LINE__和__FILE__ 编译的行数 __FILE__包含正在被编译的文件的名字 可以这样使用它们&lt;br /&gt;if ( element_count == 0 ) cerr &lt;&lt; "Error: " &lt;&lt; __FILE__&lt;br /&gt;&lt;&lt; " : line " &lt;&lt; __LINE__ &lt;&lt; "element_count must be non-zero.\n";&lt;br /&gt;另外两个预定义名字分别包含当前被编译文件的编译时间 __TIME__ __DATE__ 时间格式为 hh:mm:ss &lt;br /&gt;因此如果在上午 8 点 17 分编译一个文件 则时间表&lt;br /&gt;如果这一天是 1996 年 10 月 31 日 星期四 则日期表示为&lt;br /&gt;若当前处理的行或文件发生变化 则__LINE__和__FILE__的值将分别被改变 其他四个 预定义名字在编译期间保持不变 它们的值也不能被修改。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-922376258899996772?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/922376258899996772/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/12/c.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/922376258899996772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/922376258899996772'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/12/c.html' title='C++ 预定义内容'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-78957595057307769</id><published>2009-12-22T06:05:00.000-08:00</published><updated>2009-12-22T06:06:34.734-08:00</updated><title type='text'>objective - C (readonly, retain, assign)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fAv06gZ6FPU/SzDSY-TnGvI/AAAAAAAAAH4/hI7QhEXB4bo/s1600-h/Screen+shot+2009-12-22+at+14.05.20.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 396px;" src="http://1.bp.blogspot.com/_fAv06gZ6FPU/SzDSY-TnGvI/AAAAAAAAAH4/hI7QhEXB4bo/s400/Screen+shot+2009-12-22+at+14.05.20.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5418061678210652914" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-78957595057307769?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/78957595057307769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/12/objective-c-readonly-retain-assign.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/78957595057307769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/78957595057307769'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/12/objective-c-readonly-retain-assign.html' title='objective - C (readonly, retain, assign)'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_fAv06gZ6FPU/SzDSY-TnGvI/AAAAAAAAAH4/hI7QhEXB4bo/s72-c/Screen+shot+2009-12-22+at+14.05.20.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-3186543959382478193</id><published>2009-12-15T09:24:00.000-08:00</published><updated>2009-12-15T09:28:23.409-08:00</updated><title type='text'></title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fAv06gZ6FPU/SyfGk5EmXAI/AAAAAAAAAHw/j51s6-4gOvQ/s1600-h/Screen+shot+2009-12-15+at+17.24.54.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 382px; height: 284px;" src="http://3.bp.blogspot.com/_fAv06gZ6FPU/SyfGk5EmXAI/AAAAAAAAAHw/j51s6-4gOvQ/s400/Screen+shot+2009-12-15+at+17.24.54.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5415515414034013186" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;1.只有这2种数字键盘才有效果。UIKeyboardTypeNumberPad，UIKeyboardTypePhonePad&lt;br /&gt;2.keyboardAppearance ＝ UIKeyboardAppearanceAlert &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;- (void)textViewDidBeginEditing:(UITextView *)textView{&lt;br /&gt;     NSArray *ws = [[UIApplication sharedApplication] windows];&lt;br /&gt;     for(UIView *w in ws){&lt;br /&gt;         NSArray *vs = [w subviews];&lt;br /&gt;         for(UIView *v in vs){&lt;br /&gt;             if([[NSString stringWithUTF8String:object_getClassName(v)]&lt;br /&gt;isEqualToString:@"UIKeyboard"]){&lt;br /&gt;                 v.backgroundColor = [UIColor redColor];&lt;br /&gt;             }&lt;br /&gt;         }&lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-3186543959382478193?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/3186543959382478193/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/12/1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/3186543959382478193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/3186543959382478193'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/12/1.html' title=''/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_fAv06gZ6FPU/SyfGk5EmXAI/AAAAAAAAAHw/j51s6-4gOvQ/s72-c/Screen+shot+2009-12-15+at+17.24.54.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-4204932629648397029</id><published>2009-12-10T08:55:00.000-08:00</published><updated>2009-12-10T08:59:34.299-08:00</updated><title type='text'>Display PDF file</title><content type='html'>&lt;pre&gt;&lt;br /&gt;webView=[[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];&lt;br /&gt;webView.backgroundColor = [UIColor whiteColor];&lt;br /&gt;webView.scalesPageToFit = YES;&lt;br /&gt;webView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);&lt;br /&gt;webView.delegate = self;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;NSBundle * mainBundle = [NSBundle mainBundle];&lt;br /&gt;NSString *IPDBfile=[mainBundle pathForResource:@"Angio-Lung cancer" ofType:@"pdf"];&lt;br /&gt;NSData *pdfData =[NSData dataWithContentsOfFile:IPDBfile];&lt;br /&gt;[webView loadData:pdfData MIMEType:@"application/pdf" textEncodingName:@"UTF-8" baseURL:[NSURL URLWithString:@""]];&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-4204932629648397029?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/4204932629648397029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/12/display-pdf-file.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/4204932629648397029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/4204932629648397029'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/12/display-pdf-file.html' title='Display PDF file'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-527830133289643103</id><published>2009-12-09T15:47:00.000-08:00</published><updated>2009-12-09T15:50:30.443-08:00</updated><title type='text'>Common Menu Screens</title><content type='html'>Legal screen. &lt;br /&gt;This can be a short sentence or a screen full of text. It will include legal issues like copyright notices.&lt;br /&gt; &lt;br /&gt;Publisher logo screen.&lt;br /&gt; It can be a requirement to show this screen before the developer logo. There may also be a requirement for how long it needs to be displayed before the user can move on.&lt;br /&gt;&lt;br /&gt;Developer logo screen. &lt;br /&gt;This is where your company logo is seen.&lt;br /&gt;&lt;br /&gt;Console logo screen. &lt;br /&gt;Some consoles require or encourage developers to display the system logo.&lt;br /&gt;&lt;br /&gt;Title screen. &lt;br /&gt;The name of the game appears here. It can also include interactive options.&lt;br /&gt;&lt;br /&gt;Options. &lt;br /&gt;An option screen allows the user to change many game settings.&lt;br /&gt;&lt;br /&gt;Credits.&lt;br /&gt;This is where everyone who worked on the game is listed.&lt;br /&gt;&lt;br /&gt;Environment or level select. &lt;br /&gt;This is used in games where the user can choose a level of loca- tion to play.&lt;br /&gt;&lt;br /&gt;Player editor. &lt;br /&gt;A player editor will allow the user to change the look and attributes of char- acters in the game.&lt;br /&gt;&lt;br /&gt;Information. &lt;br /&gt;This screen can have extra information, such as story, maps, and so on.&lt;br /&gt;&lt;br /&gt;Save / Load game. &lt;br /&gt;This screen lists how many games are saved and allows the user to load and save games.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Before you move on to creating art is a good time to make changes to the flow. &lt;br /&gt;&lt;br /&gt;■       How many options appear on each screen?&lt;br /&gt;■ Are they logically grouped? &lt;br /&gt;■ How fast can a new player get into a game?&lt;br /&gt;■ How fast can an experienced player get into the game?&lt;br /&gt;■ Which options will the player want to adjust often?&lt;br /&gt;■ Which options will be changed rarely?&lt;br /&gt;■ How does this menu compare with similar games?&lt;br /&gt;■ How many dead-ends are there? (When the user must back up to start the game.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-527830133289643103?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/527830133289643103/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/12/common-menu-screens.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/527830133289643103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/527830133289643103'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/12/common-menu-screens.html' title='Common Menu Screens'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-4367801566623985360</id><published>2009-12-08T15:19:00.001-08:00</published><updated>2009-12-08T15:38:36.158-08:00</updated><title type='text'>Game Interface Design (Menu Flow)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fAv06gZ6FPU/Sx7fLwCJ9GI/AAAAAAAAAHU/VhYQspGl6CY/s1600-h/Screen+shot+2009-12-08+at+23.16.44.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 306px;" src="http://1.bp.blogspot.com/_fAv06gZ6FPU/Sx7fLwCJ9GI/AAAAAAAAAHU/VhYQspGl6CY/s400/Screen+shot+2009-12-08+at+23.16.44.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5413009195111412834" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fAv06gZ6FPU/Sx7fPFUuKLI/AAAAAAAAAHc/OhV9s0afLfM/s1600-h/Screen+shot+2009-12-08+at+23.17.01.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 284px;" src="http://3.bp.blogspot.com/_fAv06gZ6FPU/Sx7fPFUuKLI/AAAAAAAAAHc/OhV9s0afLfM/s400/Screen+shot+2009-12-08+at+23.17.01.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5413009252366035122" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fAv06gZ6FPU/Sx7jTfA7F9I/AAAAAAAAAHk/ppzPLRs5bhk/s1600-h/Screen+shot+2009-12-08+at+23.37.25.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 293px;" src="http://1.bp.blogspot.com/_fAv06gZ6FPU/Sx7jTfA7F9I/AAAAAAAAAHk/ppzPLRs5bhk/s400/Screen+shot+2009-12-08+at+23.37.25.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5413013726028306386" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-4367801566623985360?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/4367801566623985360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/12/game-interface-design-menu-flow.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/4367801566623985360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/4367801566623985360'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/12/game-interface-design-menu-flow.html' title='Game Interface Design (Menu Flow)'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_fAv06gZ6FPU/Sx7fLwCJ9GI/AAAAAAAAAHU/VhYQspGl6CY/s72-c/Screen+shot+2009-12-08+at+23.16.44.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-6432529406233085548</id><published>2009-12-06T13:50:00.000-08:00</published><updated>2009-12-06T13:52:19.838-08:00</updated><title type='text'>音频播放 (转)</title><content type='html'>iphone OS主要提供以下4种播放音频的方法。&lt;br /&gt;Sestem Sound Services、AVAudioPlayer类、Audio Queue Services、OpenAL&lt;br /&gt;1.Sestem Sound Services&lt;br /&gt;Sestem Sound Services是最底层的也是最简单的声音播放服务，调用AudioServicesPlaySystemSound这个方法就可以播放一些简单的音频文件，使用此方法只适合播放一些很小的提示或警告音，因为他有很多限制:&lt;br /&gt;{&lt;br /&gt;声音长度要小于30秒&lt;br /&gt;In linear PCM或者IMA4（IMA/ADPCM）格式的&lt;br /&gt;打包成.caf,.aif,或者.wav的文件&lt;br /&gt;不能控制播放的进度&lt;br /&gt;调用方法后立即播放声音&lt;br /&gt;没有循环播放和立体声音控制&lt;br /&gt;}&lt;br /&gt;另外，他还可以调用系统的震动功能。还可以通过AudioServices&lt;br /&gt;AddSystemSoundCompletion方法为音频播放添加CallBack函数，有了CallBack函数我们可以解决不少问题，比如可以克服System Sound Services本身不支持循环播放的问题。&lt;br /&gt;一下代码可以实现在一个程序中循环播放背景音乐：&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   1. static void completionCallback(SystemSoundID mySSID)&lt;br /&gt;   2. {&lt;br /&gt;   3. AudioServicesPlaySystemSound(mySSID);&lt;br /&gt;   4. }&lt;br /&gt;   5. -(void)playSound&lt;br /&gt;   6. {&lt;br /&gt;   7. CFBundleRef mainBundle;&lt;br /&gt;   8. SystemSoundID soundFileObject;&lt;br /&gt;   9. mainBundle=CFBundleGetMainBundle();&lt;br /&gt;  10.&lt;br /&gt;&lt;br /&gt;  11. CFURLRef soundFileURLRef=CFBundleCopyResourceURL(&lt;br /&gt;  12. mainBundle,CFSTR("background"),CFSTR("wav"),NULL);&lt;br /&gt;  13. AudioServicesCreateSystemSoundID(&lt;br /&gt;  14. soundFileURLRef,&amp;soundFileObject);&lt;br /&gt;  15. AudioServicesAddSystemSoundCompletion(soundFileObject,NULL,NULL,completionCallback,(void*)self);&lt;br /&gt;  16. AudioServicesPlaySystemSound(soundFileObject);&lt;br /&gt;  17. }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;复制代码&lt;br /&gt;2.AVAudioPlayer类&lt;br /&gt;AVAudioPlayer是AVFoundation.framework中定义的一个类，所以使用前要在工程中引入AVFoundation.framework。可以把AVAudioPlayer看做是一个高级播放器，它支持广泛的音频格式，主要有：&lt;br /&gt;{&lt;br /&gt;AAC、AMR(AdaptiveMulti-Rate，aformatforspeech)、ALAC(AppleLossless)、iLBC(internetLowBitrateCodec，anotherformatforspeech)、IMA4(IMA/ADPCM)、linearPCM、u-lawanda-law、mp3&lt;br /&gt;}AVAudioPlayer可以播放任意长度的音频文件、支持循环播放、可以同步播放很多个音频文件、控制播放进度以及从音频文件的任意一点开始播放等，要使用AVAudioPlayer的对象播放文件，只需要为其指定一个音频文件设定一个实现了AVAudioPlayerDelegate协议的 delegate对象。下边的例子和上边的一样实现一直循环播放背景音乐：&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   1. -(void)playBackgroundSoundEffect&lt;br /&gt;   2. {&lt;br /&gt;   3. NSString *soundFilePath=[[NSBundle mainBundle] pathForResource:@"background",ofType@"wav"];&lt;br /&gt;   4. NSURL *fileURL=[[NSURL alloc]initFileURLWithPath:soundFilePath];&lt;br /&gt;   5. AVAudioPlayer *newPlayer=[[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil];&lt;br /&gt;   6. [fileURL release];&lt;br /&gt;   7. self.player=newPlayer;&lt;br /&gt;   8. [newPlayer release];&lt;br /&gt;   9. [self.player prepareToplay];&lt;br /&gt;  10. [self.player setDelegate:self];&lt;br /&gt;  11. self.player.numberOfLoops=-1;&lt;br /&gt;  12. [self.player play];&lt;br /&gt;  13. }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;复制代码&lt;br /&gt;可以看到，只要将AVAudioPlayer的numberOfLoops属性设为负数，音频文件就会一直循环播放直到调用stop方法。&lt;br /&gt;AVAudioPlayer同样支持Callback，这是AVAudioPlayerDelegate的一个可选delegate方法。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   1. -(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag&lt;br /&gt;   2. {&lt;br /&gt;   3. if(player==self.player&amp;&amp;flag==YES){NSLog(@"Playback finish");}&lt;br /&gt;   4. }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;复制代码&lt;br /&gt;另外，可以随时控制AVAudioPlayer对象的播放、停止以及暂停，通过判断对象的状态，分别调用play、pause和stop方法即可：&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   1. -(IBAction)playOrPause:(id)sender{&lt;br /&gt;   2. if(self.playing){[self.player pause];}&lt;br /&gt;   3. else{[self.player play];}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;复制代码&lt;br /&gt;虽然AVAudioPlayer可以播放很多格式，但是我们在实际开发过程中还是最好使用一些没有压缩的格式，比如WAVE文件，这样可以减少系统处理单元的资源占用，以更好的完成程序的其他功能。另外，在使用AVAudioPlayer连续播放mp3这类经过压缩的音频文件时，在连接处可能出现一定的间隔时间。&lt;br /&gt;3.Audio Queue Services&lt;br /&gt;如果以上两种音频播放的解决方案都无法满足你的需求，可以使用Audio Queue Services，使用Audio Queue Services可以实现对声音的控制。例如，可以在声音数据从文件读到缓冲区后对声音进行一定处理再进行播放，从而实现对音频的快慢播放的功能。&lt;br /&gt;4.OpenAL&lt;br /&gt;OpenAL是一套跨平台开源的音频处理接口，与图形处理的OpenGL类似，它为音频播放提供了一套更加优化的方案，它适合开发游戏的音效，用法也与其他平台下相同。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-6432529406233085548?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/6432529406233085548/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/12/blog-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/6432529406233085548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/6432529406233085548'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/12/blog-post.html' title='音频播放 (转)'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-1357601887439612629</id><published>2009-11-30T13:30:00.000-08:00</published><updated>2009-11-30T13:31:29.480-08:00</updated><title type='text'>iPhone VolumeSettingsAlertShow</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fAv06gZ6FPU/SxQ5p5D0T9I/AAAAAAAAAHM/1jPbxeaicww/s1600/IMG_0033.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 267px; height: 400px;" src="http://2.bp.blogspot.com/_fAv06gZ6FPU/SxQ5p5D0T9I/AAAAAAAAAHM/1jPbxeaicww/s400/IMG_0033.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5410012444233060306" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MPVolumeSettingsAlertShow();&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-1357601887439612629?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/1357601887439612629/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/11/iphone-volumesettingsalertshow.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/1357601887439612629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/1357601887439612629'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/11/iphone-volumesettingsalertshow.html' title='iPhone VolumeSettingsAlertShow'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_fAv06gZ6FPU/SxQ5p5D0T9I/AAAAAAAAAHM/1jPbxeaicww/s72-c/IMG_0033.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-7397743877639317917</id><published>2009-11-25T15:33:00.000-08:00</published><updated>2009-11-25T15:34:52.970-08:00</updated><title type='text'>converts a string of hexadecimal digits into its equivalent integer value</title><content type='html'>&lt;pre&gt;&lt;br /&gt;#import &lt;Foundation/Foundation.h&gt;&lt;br /&gt;#define key 16&lt;br /&gt;&lt;br /&gt;void tran (char s[]) {&lt;br /&gt; int i = 0;&lt;br /&gt; int sum = 0;&lt;br /&gt; while (i&lt;strlen(s)) {&lt;br /&gt;  if (s[i]&gt;='0'&amp;&amp;s[i]&lt;='9') {&lt;br /&gt;   sum += (s[i]-'0')*pow(key,strlen(s)-1-i);&lt;br /&gt;  }else if (s[i]&gt;='A'&amp;&amp;s[i]&lt;='F'){&lt;br /&gt;   sum += (s[i]-'A'+10)*pow(key, strlen(s)-1-i);&lt;br /&gt;  }else if (s[i]&gt;='a'&amp;&amp;s[i]&lt;='f') {&lt;br /&gt;   sum += (s[i]-'a'+10)*pow(key, strlen(s)-1-i);&lt;br /&gt;  }&lt;br /&gt;  i++;&lt;br /&gt; }&lt;br /&gt; printf("%s等于%d\n",s,sum);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//去掉回车&lt;br /&gt;/***********************&gt; ReplaceReturnAtEndOfString &lt;*/&lt;br /&gt;void    ReplaceReturnAtEndOfString( char *theString ) {&lt;br /&gt;    int    length = strlen( theString );&lt;br /&gt;    &lt;br /&gt;    theString[ length - 1 ] = '\0';&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main (int argc, const char * argv[]) {&lt;br /&gt;    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];&lt;br /&gt; char s[20];&lt;br /&gt; loop: printf("16进制转10进制"); &lt;br /&gt; fgets(s, 20, stdin );&lt;br /&gt; ReplaceReturnAtEndOfString(s);&lt;br /&gt; tran(s);&lt;br /&gt; goto loop;&lt;br /&gt;    [pool drain];&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-7397743877639317917?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/7397743877639317917/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/11/converts-string-of-hexadecimal-digits.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/7397743877639317917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/7397743877639317917'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/11/converts-string-of-hexadecimal-digits.html' title='converts a string of hexadecimal digits into its equivalent integer value'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-5298925971279406415</id><published>2009-11-22T12:37:00.000-08:00</published><updated>2009-11-22T12:38:47.536-08:00</updated><title type='text'>Bullet 3D 物理引擎 简析(2)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fAv06gZ6FPU/SwmhTEB6qII/AAAAAAAAAHE/DNkphbqT-T8/s1600/18_5408_7de064c084ed82c.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 296px;" src="http://2.bp.blogspot.com/_fAv06gZ6FPU/SwmhTEB6qII/AAAAAAAAAHE/DNkphbqT-T8/s400/18_5408_7de064c084ed82c.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5407030176506357890" /&gt;&lt;/a&gt;&lt;br /&gt;   1. 理论准备：本科的数学分析，理论力学，线性代数。 尤其是理论力学中的朗格朗日动力学部分&lt;br /&gt;        最好能回忆起来。 碰撞检测上面列的两本书的内容就足够了，如果进一步挖掘需要看&lt;br /&gt;        计算几何方面的书&lt;br /&gt;   2. 补一个架构图 引自[1]的12页，其中的STC即为上次分析中的islandmanager  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;碰撞响应的分析&lt;br /&gt;&lt;br /&gt;   1.   约束分类：可积约束，不可积约束 ，摩擦力（见[1]第四章）&lt;br /&gt;   2. 整个bullet在动力学方面的核心就是btSequentialImpulseConstraintSolver 这个类及其实现&lt;br /&gt;      这个类名字可以翻译为基于顺序冲量处理方法的约束求解过程(这是个缩略的函数名不可直译）。&lt;br /&gt;      这个名字的含义很重要，表示了这个求解方法是按照顺序来处理约束以及接触点，摩擦力，one by one&lt;br /&gt;      并且求解的结果是冲量的范数。整个的原理部分可以参照[1]的第4章节，[2]的第7章。 &lt;br /&gt;   3. btSequentialImpulseConstraintSolver 的全部重心在于solveGroupCacheFriendlySetup&lt;br /&gt;      负责对于三种约束进行计算准备（包括计算一些解方程要用到的常量以及中间变量等）和 solveGroupCacheFriendlyIterations&lt;br /&gt;      负责应用PGS[9]求解。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;solveGroupCacheFriendlySetup 分析&lt;br /&gt;&lt;br /&gt;   1. 首先是关于可积约束的计算准备：首先是遍历约束数组，每一个约束都需要计算自己的jacbian（关键概念参照[1]的第四章）&lt;br /&gt;      初始化一些常量和中间变量 这里有些概念和公式比如惯性张量等都可以在[1]，[8]中找到&lt;br /&gt;   2. 关于接触点约束的计算准备：这里有个重要的函数convertContact， 把从碰撞检测阶段获得的接触点转化为不可积约束并初始化常量和中间变量，&lt;br /&gt;      以及初始化摩擦力的相关数据，摩擦力计算参照[1]第4章第6节 其中引用的公式也来自[1] 但是考虑到实时性，并不完全一致。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;solveGroupCacheFriendlyIterations 分析&lt;br /&gt;&lt;br /&gt;    *   分别根据[9]中的PGS算法求解3类约束，重点是基于SIMD的优化，以及递归次数10的设置。&lt;br /&gt;        对于PGS的理解最好从Gauss-Sidel数值解法入手。&lt;br /&gt;        对于各类约束类型对应的jacbian 参照[1]第四章节71页&lt;br /&gt;    * 核心的数据结构&lt;br /&gt;          btSolverConstraint  存储每个约束的计算常量中间变量&lt;br /&gt;          btSolverBody        几何刚体对象和动力学求解对象的连接体&lt;br /&gt;    * 其它&lt;br /&gt;          整个过程中涉及到了穿透矫正[1]111页，时间递进[1]90页，bullet 没有采用多接触点同时求解的方法，会带来一些误差&lt;br /&gt;       &lt;br /&gt;&lt;br /&gt;[1]的第4章是整个动力学模拟的灵魂，理解了这章，整个求解过程都容易理解&lt;br /&gt;&lt;br /&gt;下一步计划写softbody的分析&lt;br /&gt;&lt;br /&gt;参考书目&lt;br /&gt;[1]Stable, Robust, and Versatile Multibody Dynamics Animation&lt;br /&gt;Kenny Erleben&lt;br /&gt;关于多刚体-动力学模拟必读的文章 bullet很多实现都参考了此文&lt;br /&gt;很好的一篇综述论文，实际上是下面这本书的草稿&lt;br /&gt;网上可以下到免费的pdf版本&lt;br /&gt;&lt;br /&gt;[2]physics based animation &lt;br /&gt;Kenny Erleben&lt;br /&gt;同作者的一本全面且用较为严格的数学语言描述物理模拟的经典好书&lt;br /&gt;涵盖刚体，流体，非刚体&lt;br /&gt;国内尚未引进，目前暂无电子版。 适合深度挖掘者使用。&lt;br /&gt;&lt;br /&gt;[3]Game Physics, David H. Eberly&lt;br /&gt;从游戏开发角度来阐释物理模拟，比较实用，内容稍显陈旧。 有电子版，不好找&lt;br /&gt;&lt;br /&gt;[4]Physics.Engine.Development&lt;br /&gt;同样是阐述物理模拟，不过是为入门读者准备，比较浅显易懂。 有电子版&lt;br /&gt;&lt;br /&gt;[5]Collision Detection in Interactive 3D Environments&lt;br /&gt;对照作者自己实现的solid碰撞检测引擎来讲述，很好的一本书。又电子版&lt;br /&gt;&lt;br /&gt;[6]Real-Time Collision Detection&lt;br /&gt;比较全面的阐述了碰撞检测，是一个初步入门的好书， 有电子版&lt;br /&gt;[7]Computational Geometry in C&lt;br /&gt;如果想在几何结构方面进一步挖掘，这本书不错，清华翻译的二版有卖，翻译的也好&lt;br /&gt;三版已出，似乎还没引进&lt;br /&gt;&lt;br /&gt;[8]Classical Mechanics. Prentice Hall, 3rd edition, January 2002.&lt;br /&gt;理论力学，很多东西忘记了可以查看这本书 有电子版&lt;br /&gt;&lt;br /&gt;[9]Iterative Dynamics with Temporal Coherence&lt;br /&gt;一篇在GDC2005？上的ppt，简短描述有关PGS算法的问题，是Box2D的作者&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-5298925971279406415?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/5298925971279406415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/11/bullet-3d-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5298925971279406415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5298925971279406415'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/11/bullet-3d-2.html' title='Bullet 3D 物理引擎 简析(2)'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_fAv06gZ6FPU/SwmhTEB6qII/AAAAAAAAAHE/DNkphbqT-T8/s72-c/18_5408_7de064c084ed82c.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-277381994197037432</id><published>2009-11-22T12:36:00.000-08:00</published><updated>2009-11-22T12:37:32.526-08:00</updated><title type='text'>Bullet 3D 物理引擎 简析(1)</title><content type='html'>原创帖子, 转载请注明出处,作者信息.  &lt;br /&gt;这个是自己分析bullet的代码过程中的笔记,比较简陋, 希望抛砖引玉, 欢迎板砖&lt;br /&gt;&lt;br /&gt;作者: 马良 (www.iphonephysics.com) (此blog需Over GW)&lt;br /&gt;0 前提假设&lt;br /&gt;    计算机图形学中的物理模拟实际上只是追求视觉近似,而并非精确的物理模拟&lt;br /&gt;    同时物理引擎从简化计算考虑, 不与渲染引擎共享对象数据采用独立的一套数据.&lt;br /&gt;&lt;br /&gt;1 架构分析&lt;br /&gt;  物理模拟的基础是建立在一些核心几何结构之上.&lt;br /&gt;核心的几何概念有&lt;br /&gt;&lt;br /&gt;   1. 形状 (shape) : shape 抽象出了几何形状的特征, 比如长方体, 球, 四面体,凸包. bullet中的形状类型非常丰富有几十种之多. 由于几何形状的特征是和具体对象无关的,所以一种形状只要维持一个实例即可, 所有映射到该shape的对象可以共享这个实例.&lt;br /&gt;   2. 包围体层次(BVH) 这个的概念可以在书中查找,一般有AABB, OBB, K-Dop, Convex Hull. Bullet 中采用的是AABB&lt;br /&gt;   3. 空间划分数据机构节点 bullet 采用AABB&lt;br /&gt;   4. 空间划分数据结构(通常是树) Bullet 中采用的主要是Dynamic AABB Tree (刚体 , 值得注意的是这里用得是曼哈顿距离) 和 Sweep and Prune (soft body)&lt;br /&gt;   5. 碰撞检测算法(这里也有很多选择完全根据检测对象来定,GJK ,sweep prune 是复杂的, box2box, shpere2shpere .... 比较简单.&lt;br /&gt;   6. 接触点(contract point, manifold)&lt;br /&gt;   7. 约束类型(bullet 提供了6种,见bullet 手册)&lt;br /&gt;   8. motion state 是对渲染引擎提供的一个接口, 便于渲染引擎更新渲染对象的位置&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;完成几何基础构建后在一个场景(collision world)内 加入 各个被模拟的物理对象(collision object)每个物理对象被映射到对映的shape, 空间划分数据结构节点. 如果再在这些对象身上附加例如速度,角速度,转动惯量等物理特征,就演化为rigid object. Soft body  情况复杂一些, 一般由mesh构成 尚在分析中.&lt;br /&gt;&lt;br /&gt;  物理模拟过程分为2个主要阶段.  &lt;br /&gt;&lt;br /&gt;    * Broad Phase: 首先进行远距碰撞检测, 利用空间分割结构,如果不在同一个子树内的物体不可能相交不用去计算, 在同一个子树内的物体被放入 overlapping pair, 再进一步由对应的算法来计算出接触点等信息. 采用哪一种算法取决于算法配置矩阵(见bullet 手册)&lt;br /&gt;    * Narrow Phase: 根据overlapping pairs 的分布情况计算出碰撞对象岛(collision Island).而后依次对各个岛进行约束分析. 亦即碰撞响应. Bullet 采用的是Sequential Impulse ConstraintSolver(http://www.gphysics.com/archives/28) 约束分析是一个非常复杂的话题,涉及到PGS算法的简化,后文会有介绍. 约束分析会根据所设定的约束类型来计算碰撞后各个对象所对应的位置,速度等, 然后与渲染引擎同步motion state.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-277381994197037432?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/277381994197037432/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/11/bullet-3d-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/277381994197037432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/277381994197037432'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/11/bullet-3d-1.html' title='Bullet 3D 物理引擎 简析(1)'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-150077611122065654</id><published>2009-11-18T12:03:00.001-08:00</published><updated>2009-11-18T12:04:08.874-08:00</updated><title type='text'>C language (the real fact of code)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fAv06gZ6FPU/SwRTMpa94iI/AAAAAAAAAG8/ssEBbUpIBd8/s1600/Screen+shot+2009-11-18+at+20.02.43.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 230px;" src="http://2.bp.blogspot.com/_fAv06gZ6FPU/SwRTMpa94iI/AAAAAAAAAG8/ssEBbUpIBd8/s400/Screen+shot+2009-11-18+at+20.02.43.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5405536929493934626" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-150077611122065654?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/150077611122065654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/11/c-language-real-fact-of-code.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/150077611122065654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/150077611122065654'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/11/c-language-real-fact-of-code.html' title='C language (the real fact of code)'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_fAv06gZ6FPU/SwRTMpa94iI/AAAAAAAAAG8/ssEBbUpIBd8/s72-c/Screen+shot+2009-11-18+at+20.02.43.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-2160101152604975725</id><published>2009-11-17T02:53:00.001-08:00</published><updated>2009-11-17T02:55:53.915-08:00</updated><title type='text'>C language (Write an alternative version of squeeze(s1,s2) that deletes each character in s1 that matches any character in the string s2)</title><content type='html'>char is Int&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#import &lt;Foundation/Foundation.h&gt;&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;#include &lt;string.h&gt;&lt;br /&gt;#define N 40&lt;br /&gt;&lt;br /&gt;void fun(char s[],int c)&lt;br /&gt;{&lt;br /&gt; int i=0;&lt;br /&gt; char*p;&lt;br /&gt; p=s;&lt;br /&gt; while(*p)&lt;br /&gt; {&lt;br /&gt;  if(*p!=c)&lt;br /&gt;  {&lt;br /&gt;   s[i]=*p;&lt;br /&gt;   i++;&lt;br /&gt;  }&lt;br /&gt;  p++;&lt;br /&gt; }&lt;br /&gt; s[i]='\0';&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main (int argc, const char * argv[]) {&lt;br /&gt;    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];&lt;br /&gt;&lt;br /&gt;    // insert code here...&lt;br /&gt;    &lt;br /&gt; char stra[N],strb[N];&lt;br /&gt; int i;&lt;br /&gt; &lt;br /&gt; printf("请输入原始字符串a: ");&lt;br /&gt; gets(stra);&lt;br /&gt; printf("请输入删除字符串b: ");&lt;br /&gt; gets(strb);&lt;br /&gt; &lt;br /&gt; for(i=0;strb[i]!='\0';i++)&lt;br /&gt;  fun(stra,strb[i]);&lt;br /&gt; printf("删除指定字符串b后的字符串a: ");&lt;br /&gt; puts(stra);&lt;br /&gt; &lt;br /&gt;    [pool drain];&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-2160101152604975725?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/2160101152604975725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/11/c-language-write-alternative-version-of.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/2160101152604975725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/2160101152604975725'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/11/c-language-write-alternative-version-of.html' title='C language (Write an alternative version of squeeze(s1,s2) that deletes each character in s1 that matches any character in the string s2)'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-6328771438555137510</id><published>2009-11-17T02:46:00.001-08:00</published><updated>2009-11-17T02:47:50.851-08:00</updated><title type='text'>C language (10进制转2，8，16进制)</title><content type='html'>&lt;pre&gt;&lt;br /&gt;#import &lt;Foundation/Foundation.h&gt;&lt;br /&gt;#import &lt;stdio.h&gt;&lt;br /&gt;&lt;br /&gt;void tran(int num, int k) {&lt;br /&gt; int arr[8],i;&lt;br /&gt; for(i=0;i&lt;8;i++) {&lt;br /&gt;  arr[i] = num % k;&lt;br /&gt;  num=num/k;&lt;br /&gt;  if(num == 0)&lt;br /&gt;   break;&lt;br /&gt; }&lt;br /&gt;  printf("转换为%d进制数为: ",k);&lt;br /&gt; &lt;br /&gt; for(;i&gt;=0;i--) {&lt;br /&gt;  switch (arr[i]) {&lt;br /&gt;   case 10:&lt;br /&gt;    printf("A");&lt;br /&gt;    break;&lt;br /&gt;   case 11:&lt;br /&gt;    printf("B");&lt;br /&gt;    break;&lt;br /&gt;   case 12:&lt;br /&gt;    printf("C");&lt;br /&gt;    break;&lt;br /&gt;   case 13:&lt;br /&gt;    printf("D");&lt;br /&gt;    break;&lt;br /&gt;   case 14:&lt;br /&gt;    printf("E");&lt;br /&gt;    break;&lt;br /&gt;   case 15:&lt;br /&gt;    printf("F");&lt;br /&gt;    break;&lt;br /&gt;   default:&lt;br /&gt;    printf("%d",arr[i]);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; printf("\n\n\n");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main (int argc, const char * argv[]) {&lt;br /&gt;    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];&lt;br /&gt;&lt;br /&gt;    // insert code here...&lt;br /&gt;    NSLog(@"Hello, World!");&lt;br /&gt; &lt;br /&gt; int num,choo; &lt;br /&gt; loop:    printf("请选择功能：0.退出  1.十进制转二进制  2.十进制转八进制  3.十进制转十六进制\n"); &lt;br /&gt; scanf("%d",&amp;choo); &lt;br /&gt; switch (choo) &lt;br /&gt; { &lt;br /&gt;        case 1: &lt;br /&gt;            printf("请输入要转换的十进制数："); &lt;br /&gt;            scanf("%d",&amp;num); &lt;br /&gt;            tran (num,2); &lt;br /&gt;            goto loop; &lt;br /&gt;        case 2: &lt;br /&gt;            printf("请输入要转换的十进制数："); &lt;br /&gt;            scanf("%d",&amp;num); &lt;br /&gt;            tran (num,8); &lt;br /&gt;            goto loop; &lt;br /&gt;        case 3: &lt;br /&gt;            printf("请输入要转换的十进制数："); &lt;br /&gt;            scanf("%d",&amp;num); &lt;br /&gt;            tran (num,16); &lt;br /&gt;            goto loop; &lt;br /&gt;        case 0:break; &lt;br /&gt;        default : &lt;br /&gt;            printf("输入有误！请重新输入！\n"); &lt;br /&gt;            goto loop; &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;    [pool drain];&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-6328771438555137510?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/6328771438555137510/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/11/c_17.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/6328771438555137510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/6328771438555137510'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/11/c_17.html' title='C language (10进制转2，8，16进制)'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-5984979435124107530</id><published>2009-11-16T02:58:00.001-08:00</published><updated>2009-11-16T02:58:40.871-08:00</updated><title type='text'>Amazing--iPhone</title><content type='html'>iPhone,THE MOBILE I am holding is a preemptive, multi- tasking computer with Unix, a graphical interface, GPS functionality, Wi-Fi, a ton of built-in libraries, and by the way, a cell phone. Amazing!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-5984979435124107530?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/5984979435124107530/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/11/amazing-iphone.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5984979435124107530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5984979435124107530'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/11/amazing-iphone.html' title='Amazing--iPhone'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-3247902065157140402</id><published>2009-11-14T08:16:00.001-08:00</published><updated>2009-11-14T08:18:21.432-08:00</updated><title type='text'>OpenGL 学习资料</title><content type='html'>新的一轮挑战，OpenGL&lt;br /&gt;&lt;br /&gt;很有用的两个学习链接&lt;br /&gt;1.http://www.videotutorialsrock.com/index.php&lt;br /&gt;2.http://nehe.gamedev.net/default.asp&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-3247902065157140402?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/3247902065157140402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/11/opengl.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/3247902065157140402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/3247902065157140402'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/11/opengl.html' title='OpenGL 学习资料'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-3975721233578673917</id><published>2009-11-11T14:44:00.000-08:00</published><updated>2009-11-11T14:47:31.271-08:00</updated><title type='text'>Recursive C language</title><content type='html'>Here’s one version of a recursive function that calculates a factorial:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;long    factorial( long num ) {&lt;br /&gt;  if ( num &gt; 1 )&lt;br /&gt;      num *= factorial( num - 1 ); &lt;br /&gt;  return( num );&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fAv06gZ6FPU/Svs-n24qeqI/AAAAAAAAAG0/hPS54aXNM8g/s1600-h/Screen+shot+2009-11-11+at+22.45.28.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 235px;" src="http://3.bp.blogspot.com/_fAv06gZ6FPU/Svs-n24qeqI/AAAAAAAAAG0/hPS54aXNM8g/s320/Screen+shot+2009-11-11+at+22.45.28.png" alt="" id="BLOGGER_PHOTO_ID_5402981032430041762" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-3975721233578673917?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/3975721233578673917/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/11/recursive-c-language.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/3975721233578673917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/3975721233578673917'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/11/recursive-c-language.html' title='Recursive C language'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_fAv06gZ6FPU/Svs-n24qeqI/AAAAAAAAAG0/hPS54aXNM8g/s72-c/Screen+shot+2009-11-11+at+22.45.28.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-2334473589800166845</id><published>2009-11-11T13:39:00.000-08:00</published><updated>2009-11-11T13:44:54.856-08:00</updated><title type='text'>Find Bug with The LLVM/Clang Static Analyzer</title><content type='html'>&lt;span style="font-weight: bold;font-size:130%;" &gt;Clang Static Analyzer&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The Clang Static Analyzer consists of both a source code analysis framework and a standalone tool that finds bugs in C and Objective-C programs. The standalone tool is invoked from the command-line, and is intended to run in tandem with a build of a project or code base.&lt;br /&gt;&lt;br /&gt;Both are 100% open source and are part of the Clang project.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Download&lt;/span&gt;&lt;/span&gt; :http://clang-analyzer.llvm.org/&lt;br /&gt;Mac OS X&lt;br /&gt;&lt;br /&gt;   * Latest build (Universal binary, 10.5+): checker-227.tar.bz2 (built November 4, 2009)&lt;br /&gt;   * Installation and usage&lt;br /&gt;&lt;h3&gt;Installation&lt;/h3&gt; &lt;p&gt;Since scan-build is a command line tool it makes sense to install it into one of OS X’s pre-defined command line tool locations. We’ll put it in /usr/local/bin.&lt;/p&gt; &lt;ol&gt;&lt;li&gt;Make sure that you’ve expanded checker-NN.tar.gz to your Downloads folder&lt;/li&gt;&lt;li&gt;We’re going to be installing the checker binaries into your /usr/local/bin directory.  Run the following command to ensure that this directory exists:&lt;/li&gt;&lt;pre&gt; &lt;pre&gt;sudo mkdir -p /usr/local/bin&lt;/pre&gt;&lt;/pre&gt;&lt;li&gt;Open Terminal.app and move the contents of checker-NN to the /usr/local/bin directory (remember to replace NN with the build number of your download): &lt;pre&gt;&lt;pre&gt;sudo mv ~/Downloads/checker-NN/* /usr/local/bin/&lt;/pre&gt;&lt;span style="font-family: Georgia,serif;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Run&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    The analyzer must be run after a &lt;code&gt;xcodebuild clean&lt;/code&gt; command.&lt;pre&gt;&lt;pre&gt;&lt;br /&gt;xcodebuild clean&lt;br /&gt;scan-build -k -V xcodebuild&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-2334473589800166845?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/2334473589800166845/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/11/find-bug-with-llvmclang-static-analyzer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/2334473589800166845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/2334473589800166845'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/11/find-bug-with-llvmclang-static-analyzer.html' title='Find Bug with The LLVM/Clang Static Analyzer'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-5893850231854381471</id><published>2009-11-09T08:23:00.001-08:00</published><updated>2009-11-09T08:25:20.812-08:00</updated><title type='text'>send Image through Email</title><content type='html'>&lt;pre&gt;&lt;br /&gt;UIImage *sendImg = [UIImage imageNamed:@"test.png"];&lt;br /&gt; NSData *imageData = UIImagePNGRepresentation(sendImg);&lt;br /&gt;&lt;br /&gt; NSString *dataStr = [testPurchase base64StringFromData:imageData length:[imageData length]];&lt;br /&gt; //NSLog(dataStr);&lt;br /&gt; //*&lt;br /&gt; NSString *body       = [@"" stringByAppendingFormat:@"&lt;b&gt;&lt;img src='data:image/png;base64,%@' alt='Interpolate Chart'&gt;&lt;/b&gt;", dataStr];&lt;br /&gt; NSString *encoded    = [body stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];&lt;br /&gt; NSString *title      = [[@"" stringByAppendingFormat:@"Interpolate: Function %@", @"test"] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];&lt;br /&gt; NSString * urlString = [@"" stringByAppendingFormat:@"mailto:wenxp2006@qq.com?subject=%@&amp;body=%@", title, encoded];&lt;br /&gt; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;//base 64 encoding&lt;br /&gt;+ (NSString *) base64StringFromData: (NSData *)data length: (int)length&lt;br /&gt;{ &lt;br /&gt; unsigned long ixtext, lentext; &lt;br /&gt; long ctremaining; &lt;br /&gt; unsigned char input[3], output[4]; &lt;br /&gt; short i, charsonline = 0, ctcopy; &lt;br /&gt; const unsigned char *raw; &lt;br /&gt; NSMutableString *result; &lt;br /&gt; &lt;br /&gt; lentext = [data length];  &lt;br /&gt; if (lentext &lt; 1) &lt;br /&gt;  return @""; &lt;br /&gt; result = [NSMutableString stringWithCapacity: lentext]; &lt;br /&gt; raw = [data bytes]; &lt;br /&gt; ixtext = 0;  &lt;br /&gt; &lt;br /&gt; while (YES) &lt;br /&gt; { &lt;br /&gt;  ctremaining = lentext - ixtext; &lt;br /&gt;  if (ctremaining &lt;= 0)  &lt;br /&gt;   break;         &lt;br /&gt;  for (i = 0; i &lt; 3; i++) &lt;br /&gt;  {  &lt;br /&gt;   unsigned long ix = ixtext + i; &lt;br /&gt;   if (ix &lt; lentext) &lt;br /&gt;    input[i] = raw[ix]; &lt;br /&gt;   else &lt;br /&gt;    input[i] = 0; &lt;br /&gt;  } &lt;br /&gt;  &lt;br /&gt;  output[0] = (input[0] &amp; 0xFC) &gt;&gt; 2; &lt;br /&gt;  output[1] = ((input[0] &amp; 0x03) &lt;&lt; 4) | ((input[1] &amp; 0xF0) &gt;&gt; 4); &lt;br /&gt;  output[2] = ((input[1] &amp; 0x0F) &lt;&lt; 2) | ((input[2] &amp; 0xC0) &gt;&gt; 6); &lt;br /&gt;  output[3] = input[2] &amp; 0x3F; &lt;br /&gt;  ctcopy = 4; &lt;br /&gt;  switch (ctremaining) &lt;br /&gt;  { &lt;br /&gt;   case 1:  &lt;br /&gt;    ctcopy = 2;  &lt;br /&gt;    break; &lt;br /&gt;   case 2:  &lt;br /&gt;    ctcopy = 3;  &lt;br /&gt;    break; &lt;br /&gt;  } &lt;br /&gt;  &lt;br /&gt;  for (i = 0; i &lt; ctcopy; i++) &lt;br /&gt;   [result appendString: [NSString stringWithFormat: @"%c", base64EncodingTable[output[i]]]]; &lt;br /&gt;  &lt;br /&gt;  for (i = ctcopy; i &lt; 4; i++) &lt;br /&gt;   [result appendString: @"="]; &lt;br /&gt;  &lt;br /&gt;  ixtext += 3; &lt;br /&gt;  charsonline += 4; &lt;br /&gt;  &lt;br /&gt;  if ((length &gt; 0) &amp;&amp; (charsonline &gt;= length)) &lt;br /&gt;   charsonline = 0; &lt;br /&gt; }&lt;br /&gt;  return result; &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;static char base64EncodingTable[64] = &lt;br /&gt;{ &lt;br /&gt;'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', &lt;br /&gt;'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', &lt;br /&gt;'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', &lt;br /&gt;'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' &lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-5893850231854381471?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/5893850231854381471/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/11/send-image-through-email.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5893850231854381471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5893850231854381471'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/11/send-image-through-email.html' title='send Image through Email'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-8184669090765192773</id><published>2009-11-08T07:36:00.001-08:00</published><updated>2009-11-08T07:36:44.727-08:00</updated><title type='text'>C simple DVD shop</title><content type='html'>&lt;pre&gt;&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;#include &lt;stdlib.h&gt;&lt;br /&gt;#include &lt;string.h&gt;&lt;br /&gt;#include "dvdTracker2.h"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/**************************************************&gt; main &lt;*/&lt;br /&gt;int main (int argc, const char * argv[]) {&lt;br /&gt; char   command;&lt;br /&gt; &lt;br /&gt; gHeadPtr = NULL;&lt;br /&gt; gTailPtr = NULL;&lt;br /&gt; &lt;br /&gt; while ( (command = GetCommand() ) != 'q' ) {&lt;br /&gt;  switch( command ) {&lt;br /&gt;   case 'n':&lt;br /&gt;    AddToList( ReadStruct() );&lt;br /&gt;    break;&lt;br /&gt;   case 'l':&lt;br /&gt;    ListDVDs();&lt;br /&gt;    break;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; printf( "Goodbye..." );&lt;br /&gt; &lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/*******************************************&gt; GetCommand &lt;*/&lt;br /&gt;char GetCommand( void )&lt;br /&gt;{&lt;br /&gt; char command;&lt;br /&gt; &lt;br /&gt; do {&lt;br /&gt;  printf( "Enter command (q=quit, n=new, l=list):  " );&lt;br /&gt;  scanf( "%c", &amp;command );&lt;br /&gt;  Flush();&lt;br /&gt; }&lt;br /&gt; while ( (command != 'q') &amp;&amp; (command != 'n')&lt;br /&gt;           &amp;&amp; (command != 'l') );&lt;br /&gt; &lt;br /&gt; printf( "\n----------\n" );&lt;br /&gt; return( command );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/*******************************************&gt; ReadStruct &lt;*/&lt;br /&gt;struct DVDInfo *ReadStruct( void ) {&lt;br /&gt; struct DVDInfo *infoPtr;&lt;br /&gt; int    num;&lt;br /&gt; &lt;br /&gt; infoPtr = (struct DVDInfo *)malloc( sizeof( struct DVDInfo ) );&lt;br /&gt; &lt;br /&gt; if ( NULL == infoPtr ) {&lt;br /&gt;  printf( "Out of memory!!!  Goodbye!\n" );&lt;br /&gt;  exit( 0 );&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; printf( "Enter DVD Title:  " );&lt;br /&gt; fgets( infoPtr-&gt;title, kMaxTitleLength, stdin );&lt;br /&gt; ReplaceReturnAtEndOfString( infoPtr-&gt;title );&lt;br /&gt; &lt;br /&gt; printf( "Enter DVD Comment:  " );&lt;br /&gt; fgets( infoPtr-&gt;comment, kMaxCommentLength, stdin );&lt;br /&gt; ReplaceReturnAtEndOfString( infoPtr-&gt;comment );&lt;br /&gt; &lt;br /&gt; do {&lt;br /&gt;  num = 0;&lt;br /&gt;        printf( "Enter DVD Rating (1-10):  " );&lt;br /&gt;  scanf( "%d", &amp;num );&lt;br /&gt;  Flush();&lt;br /&gt; }&lt;br /&gt; while ( ( num &lt; 1 ) || ( num &gt; 10 ) );&lt;br /&gt; &lt;br /&gt; infoPtr-&gt;rating = num;&lt;br /&gt; &lt;br /&gt; printf( "\n----------\n" );&lt;br /&gt; &lt;br /&gt; return( infoPtr );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/*******************************************&gt; AddToList &lt;*/&lt;br /&gt;void AddToList( struct DVDInfo *curPtr ) {&lt;br /&gt; struct DVDInfo *beforePtr;&lt;br /&gt;    &lt;br /&gt; /* First check to see if the list is empty */&lt;br /&gt; if ( gHeadPtr == NULL )&lt;br /&gt;  InsertInList( NULL, curPtr );&lt;br /&gt; else if ( curPtr-&gt;rating &lt;= gHeadPtr-&gt;rating )&lt;br /&gt;    /* Next check to see if curPtr should be the new first item */&lt;br /&gt;  InsertInList( NULL, curPtr );&lt;br /&gt; else {&lt;br /&gt;    /* Walk through the list till you find the first rating higher than us */&lt;br /&gt;  beforePtr = gHeadPtr;&lt;br /&gt;  &lt;br /&gt;  while ( (beforePtr-&gt;next != NULL) &amp;&amp;&lt;br /&gt;               (beforePtr-&gt;next-&gt;rating &lt; curPtr-&gt;rating) ) {&lt;br /&gt;   beforePtr = beforePtr-&gt;next;&lt;br /&gt;  }&lt;br /&gt;  InsertInList( beforePtr, curPtr );&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/*******************************************&gt; InsertInList &lt;*/&lt;br /&gt;void InsertInList( struct DVDInfo *afterMeDVDPtr, struct DVDInfo *newDVDPtr )&lt;br /&gt;{&lt;br /&gt; if ( afterMeDVDPtr == NULL ) {&lt;br /&gt;    /* This means we want to insert the new one as the first in the list */&lt;br /&gt;  newDVDPtr-&gt;next = gHeadPtr;&lt;br /&gt;  gHeadPtr = newDVDPtr;&lt;br /&gt;  if ( gTailPtr == NULL )&lt;br /&gt;   gTailPtr = newDVDPtr;&lt;br /&gt; }&lt;br /&gt; else if ( afterMeDVDPtr == gTailPtr ) {&lt;br /&gt;    /* This means we want to insert the new one as the last in the list */&lt;br /&gt;  gTailPtr-&gt;next = newDVDPtr;&lt;br /&gt;  newDVDPtr-&gt;next = NULL;&lt;br /&gt;  gTailPtr = newDVDPtr;&lt;br /&gt; }&lt;br /&gt; else {&lt;br /&gt;  newDVDPtr-&gt;next = afterMeDVDPtr-&gt;next;&lt;br /&gt;  afterMeDVDPtr-&gt;next = newDVDPtr;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/*******************************************&gt; ListDVDs &lt;*/&lt;br /&gt;void ListDVDs( void ) {&lt;br /&gt; struct DVDInfo *curPtr;&lt;br /&gt; &lt;br /&gt; if ( NULL == gHeadPtr ) {&lt;br /&gt;  printf( "No DVDs have been entered yet...\n" );&lt;br /&gt;  printf( "\n----------\n" );&lt;br /&gt; } else {&lt;br /&gt;  for ( curPtr=gHeadPtr; curPtr!=NULL; curPtr = curPtr-&gt;next ) {&lt;br /&gt;   printf( "Title:  %s\n", curPtr-&gt;title );&lt;br /&gt;   printf( "Comment:   %s\n", curPtr-&gt;comment );&lt;br /&gt;   printf( "Rating:  %d\n", curPtr-&gt;rating );&lt;br /&gt;   &lt;br /&gt;   printf( "\n----------\n" );&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/***********************&gt; ReplaceReturnAtEndOfString &lt;*/&lt;br /&gt;void    ReplaceReturnAtEndOfString( char *theString ) {&lt;br /&gt;    int    length = strlen( theString );&lt;br /&gt;    &lt;br /&gt;    theString[ length - 1 ] = '\0';&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/*******************************************&gt; Flush &lt;*/&lt;br /&gt;void Flush( void ) {&lt;br /&gt; while ( getchar() != '\n' )&lt;br /&gt;  ;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-8184669090765192773?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/8184669090765192773/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/11/c_08.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/8184669090765192773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/8184669090765192773'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/11/c_08.html' title='C simple DVD shop'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-8229108789487325882</id><published>2009-11-05T08:38:00.000-08:00</published><updated>2009-11-05T08:41:14.174-08:00</updated><title type='text'>UITableView's Scroll range</title><content type='html'>&lt;pre&gt;&lt;br /&gt;    UIEdgeInsets insets = UIEdgeInsetsMake(0, 0, intersectionFrame.size.height, 0);&lt;br /&gt;    [self.tableView setContentInset:insets];&lt;br /&gt;    [self.tableView setScrollIndicatorInsets:insets];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;UIEdgeInsets UIEdgeInsetsMake (&lt;br /&gt;   CGFloat top,&lt;br /&gt;   CGFloat left,&lt;br /&gt;   CGFloat bottom,&lt;br /&gt;   CGFloat right&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;[self.tableView setContentInset:insets]; &lt;br /&gt;The content of tableView displayed in the insets(Rect)&lt;br /&gt;&lt;br /&gt;[self.tableView setScrollIndicatorInsets:insets];&lt;br /&gt;The Scroll range of the tableView&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-8229108789487325882?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/8229108789487325882/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/11/uitableviews-scroll-range.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/8229108789487325882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/8229108789487325882'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/11/uitableviews-scroll-range.html' title='UITableView&apos;s Scroll range'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-5776156597140311632</id><published>2009-11-05T04:32:00.000-08:00</published><updated>2009-11-05T04:37:43.375-08:00</updated><title type='text'>Camera and ActionSheet API of iPhone</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fAv06gZ6FPU/SvLGuUawbSI/AAAAAAAAAGU/fb99paqrc0A/s1600-h/IMG_0014.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://2.bp.blogspot.com/_fAv06gZ6FPU/SvLGuUawbSI/AAAAAAAAAGU/fb99paqrc0A/s320/IMG_0014.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5400597402227862818" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fAv06gZ6FPU/SvLG0wc_SDI/AAAAAAAAAGc/ckxIFDhIrok/s1600-h/IMG_0015.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://3.bp.blogspot.com/_fAv06gZ6FPU/SvLG0wc_SDI/AAAAAAAAAGc/ckxIFDhIrok/s320/IMG_0015.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5400597512832632882" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fAv06gZ6FPU/SvLG8ZQHa9I/AAAAAAAAAGk/rPTGc9S33X0/s1600-h/IMG_0016.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://1.bp.blogspot.com/_fAv06gZ6FPU/SvLG8ZQHa9I/AAAAAAAAAGk/rPTGc9S33X0/s320/IMG_0016.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5400597644043578322" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fAv06gZ6FPU/SvLHBbezgUI/AAAAAAAAAGs/NNOh7GWcHb8/s1600-h/IMG_0017.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://1.bp.blogspot.com/_fAv06gZ6FPU/SvLHBbezgUI/AAAAAAAAAGs/NNOh7GWcHb8/s320/IMG_0017.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5400597730541404482" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;UIActionSheetDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate&gt;&lt;br /&gt;&lt;br /&gt;click a button raise an actionsheet&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;- (IBAction)addPhoto:(id)sender {&lt;br /&gt; UIActionSheet *cameraSheet = [[UIActionSheet alloc] initWithTitle:nil &lt;br /&gt;                delegate:self &lt;br /&gt;             cancelButtonTitle:@"Cancel" &lt;br /&gt;              destructiveButtonTitle:nil &lt;br /&gt;             otherButtonTitles:@"TakePicture",@"ChooseFromLibrary",nil];&lt;br /&gt; cameraSheet.actionSheetStyle = UIActionSheetStyleBlackOpaque;&lt;br /&gt; [cameraSheet showInView:self.view];&lt;br /&gt; [cameraSheet release];&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Delegation methods of ActionSheet&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {&lt;br /&gt; if (buttonIndex == 0) {&lt;br /&gt;  if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {&lt;br /&gt;   UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];&lt;br /&gt;   imagePicker.delegate = self;&lt;br /&gt;   imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;&lt;br /&gt;   imagePicker.allowsEditing = YES;&lt;br /&gt;   [self presentModalViewController:imagePicker animated:YES];&lt;br /&gt;   [imagePicker release];&lt;br /&gt;  } else {&lt;br /&gt;   [actionSheet dismissWithClickedButtonIndex:buttonIndex animated:YES];&lt;br /&gt;  }&lt;br /&gt; } else if (buttonIndex == 1) {&lt;br /&gt;  UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];&lt;br /&gt;  imagePicker.delegate = self;&lt;br /&gt;  imagePicker.allowsEditing = YES;&lt;br /&gt;  &lt;br /&gt;  if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]){&lt;br /&gt;   imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;&lt;br /&gt;   [self presentModalViewController:imagePicker animated:YES];&lt;br /&gt;   [imagePicker release];&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  else if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeSavedPhotosAlbum]){&lt;br /&gt;   imagePicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;&lt;br /&gt;   [self presentModalViewController:imagePicker animated:YES];&lt;br /&gt;   [imagePicker release];&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  else{&lt;br /&gt;   [actionSheet dismissWithClickedButtonIndex:buttonIndex animated: YES];&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Delegate methods of UIImagePickerControllerDelegate&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#pragma mark -&lt;br /&gt;#pragma mark UIImagePickerControllerDelegate Methods&lt;br /&gt;&lt;br /&gt;- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker  {&lt;br /&gt; [self dismissModalViewControllerAnimated:YES];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)selectedImage editingInfo:(NSDictionary *)editingInfo {&lt;br /&gt; [self dismissModalViewControllerAnimated:YES];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-5776156597140311632?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/5776156597140311632/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/11/camera-and-actionsheet-api-of-iphone.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5776156597140311632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5776156597140311632'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/11/camera-and-actionsheet-api-of-iphone.html' title='Camera and ActionSheet API of iPhone'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_fAv06gZ6FPU/SvLGuUawbSI/AAAAAAAAAGU/fb99paqrc0A/s72-c/IMG_0014.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-3724763824041486963</id><published>2009-11-04T15:40:00.000-08:00</published><updated>2009-11-04T15:41:40.692-08:00</updated><title type='text'>C language Octal to ASCII printable characters</title><content type='html'>32 to 47 ---&gt;  !"#$%&amp;'()*+,-./&lt;br /&gt;48 to 57 ---&gt; 0123456789&lt;br /&gt;58 to 64 ---&gt; :;&lt;=&gt;?@&lt;br /&gt;65 to 90 ---&gt; ABCDEFGHIJKLMNOPQRSTUVWXYZ&lt;br /&gt;91 to 96 ---&gt; [\]^_`&lt;br /&gt;97 to 122 ---&gt; abcdefghijklmnopqrstuvwxyz&lt;br /&gt;123 to 126 ---&gt; {|}~&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-3724763824041486963?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/3724763824041486963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/11/c-language-octal-to-ascii-printable.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/3724763824041486963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/3724763824041486963'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/11/c-language-octal-to-ascii-printable.html' title='C language Octal to ASCII printable characters'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-277961515266338693</id><published>2009-11-04T15:34:00.000-08:00</published><updated>2009-11-04T15:36:04.717-08:00</updated><title type='text'>C language (char,short,int,long)</title><content type='html'>&lt;pre&gt;&lt;br /&gt;int main (int argc, const char * argv[]) {&lt;br /&gt; printf( "sizeof( char ) = %d\n", (int)sizeof( char ) );&lt;br /&gt; printf( "sizeof( short ) = %d\n", (int)sizeof( short ) );&lt;br /&gt; printf( "sizeof( int ) = %d\n", (int)sizeof( int ) );&lt;br /&gt; printf( "sizeof( long ) = %d\n", (int)sizeof( long ) );&lt;br /&gt; &lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;sizeof( char ) = 1&lt;br /&gt;sizeof( short ) = 2&lt;br /&gt;sizeof( int ) = 4&lt;br /&gt;sizeof( long ) = 4&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-277961515266338693?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/277961515266338693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/11/c-language-charshortintlong.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/277961515266338693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/277961515266338693'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/11/c-language-charshortintlong.html' title='C language (char,short,int,long)'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-1065715074602936080</id><published>2009-11-04T15:28:00.002-08:00</published><updated>2009-11-04T15:31:21.514-08:00</updated><title type='text'>C language (float,double,longDouble)</title><content type='html'>&lt;Pre&gt;&lt;br /&gt;int main (int argc, const char * argv[]) {&lt;br /&gt; float   myFloat;&lt;br /&gt; double   myDouble;&lt;br /&gt; long double  myLongDouble;&lt;br /&gt; &lt;br /&gt; myFloat = 12345.67890123456789F;&lt;br /&gt; myDouble = 12345.67890123456789;&lt;br /&gt; myLongDouble = 12345.67890123456789L;&lt;br /&gt; &lt;br /&gt; printf( "sizeof( float ) = %d\n", (int)sizeof( float ) );&lt;br /&gt; printf( "sizeof( double ) = %d\n", (int)sizeof( double ) );&lt;br /&gt; printf( "sizeof( long double ) = %d\n\n", (int)sizeof( long double ) );&lt;br /&gt; &lt;br /&gt; printf( "myFloat = %f\n", myFloat );&lt;br /&gt; printf( "myDouble = %f\n", myDouble );&lt;br /&gt; printf( "myLongDouble = %Lf\n\n", myLongDouble );&lt;br /&gt; &lt;br /&gt; printf( "myFloat = %25.16f\n", myFloat );&lt;br /&gt; printf( "myDouble = %25.16f\n", myDouble );&lt;br /&gt; printf( "myLongDouble = %25.16Lf\n\n", myLongDouble );&lt;br /&gt; &lt;br /&gt; printf( "myFloat = %10.1f\n", myFloat );&lt;br /&gt; printf( "myFloat = %.2f\n", myFloat );&lt;br /&gt; printf( "myFloat = %.12f\n", myFloat );&lt;br /&gt; printf( "myFloat = %.9f\n\n", myFloat );&lt;br /&gt; &lt;br /&gt; printf( "myFloat = %e\n\n", myFloat );&lt;br /&gt; &lt;br /&gt; myFloat = 100000;&lt;br /&gt; printf( "myFloat = %g\n", myFloat );&lt;br /&gt; &lt;br /&gt; myFloat = 1000000;&lt;br /&gt; printf( "myFloat = %g\n", myFloat );&lt;br /&gt; &lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;result&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;sizeof( float ) = 4&lt;br /&gt;sizeof( double ) = 8&lt;br /&gt;sizeof( long double ) = 16&lt;br /&gt;&lt;br /&gt;myFloat = 12345.678711&lt;br /&gt;myDouble = 12345.678901&lt;br /&gt;myLongDouble = 12345.678901&lt;br /&gt;&lt;br /&gt;myFloat =    12345.6787109375000000&lt;br /&gt;myDouble =    12345.6789012345670926&lt;br /&gt;myLongDouble =    12345.6789012345678902&lt;br /&gt;&lt;br /&gt;myFloat =    12345.7&lt;br /&gt;myFloat = 12345.68&lt;br /&gt;myFloat = 12345.678710937500&lt;br /&gt;myFloat = 12345.678710938&lt;br /&gt;&lt;br /&gt;myFloat = 1.234568e+04&lt;br /&gt;&lt;br /&gt;myFloat = 100000&lt;br /&gt;myFloat = 1e+06&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-1065715074602936080?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/1065715074602936080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/11/c-language-floatdoublelongdouble.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/1065715074602936080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/1065715074602936080'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/11/c-language-floatdoublelongdouble.html' title='C language (float,double,longDouble)'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-6940991224301787309</id><published>2009-11-04T15:28:00.001-08:00</published><updated>2009-11-04T15:28:08.998-08:00</updated><title type='text'>C</title><content type='html'>&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-6940991224301787309?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/6940991224301787309/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/11/c.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/6940991224301787309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/6940991224301787309'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/11/c.html' title='C'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-5940375797199769913</id><published>2009-10-30T05:42:00.000-07:00</published><updated>2009-10-30T05:48:37.087-07:00</updated><title type='text'>Xcode small skills</title><content type='html'>select all the hole line codes&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fAv06gZ6FPU/Surfi_ETorI/AAAAAAAAAGM/h0uPaLkRSRs/s1600-h/Screen+shot+2009-10-30+at+12.43.27.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 17px;" src="http://3.bp.blogspot.com/_fAv06gZ6FPU/Surfi_ETorI/AAAAAAAAAGM/h0uPaLkRSRs/s400/Screen+shot+2009-10-30+at+12.43.27.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5398372895495004850" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Put the vertical cursor in front of the code line which you will select.&lt;br /&gt;&lt;br /&gt;Then click "command + shift + right" keys.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-5940375797199769913?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/5940375797199769913/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/10/xcode-small-skills.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5940375797199769913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5940375797199769913'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/10/xcode-small-skills.html' title='Xcode small skills'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_fAv06gZ6FPU/Surfi_ETorI/AAAAAAAAAGM/h0uPaLkRSRs/s72-c/Screen+shot+2009-10-30+at+12.43.27.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-2844224441982107288</id><published>2009-10-30T05:09:00.000-07:00</published><updated>2009-10-30T05:17:49.123-07:00</updated><title type='text'>How to Make a Call from Program?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fAv06gZ6FPU/SurX1yQ80WI/AAAAAAAAAGE/8HITiIV9mlU/s1600-h/IMG_0011.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 267px; height: 400px;" src="http://4.bp.blogspot.com/_fAv06gZ6FPU/SurX1yQ80WI/AAAAAAAAAGE/8HITiIV9mlU/s400/IMG_0011.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5398364422382866786" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fAv06gZ6FPU/SurXyaajwwI/AAAAAAAAAF8/n-dvhK6AbBQ/s1600-h/IMG_0009.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 267px; height: 400px;" src="http://1.bp.blogspot.com/_fAv06gZ6FPU/SurXyaajwwI/AAAAAAAAAF8/n-dvhK6AbBQ/s400/IMG_0009.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5398364364441109250" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We always make a call through type number in the Keyboard of iPhone.&lt;br /&gt;&lt;br /&gt;Anyhow as a iPhone programmer I will show you how to make a call by coding.  ^_^~!@&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel:0872344598"]];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;  &lt;br /&gt;So easy try it!! Very COOL&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-2844224441982107288?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/2844224441982107288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/10/how-to-make-call-from-program.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/2844224441982107288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/2844224441982107288'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/10/how-to-make-call-from-program.html' title='How to Make a Call from Program?'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_fAv06gZ6FPU/SurX1yQ80WI/AAAAAAAAAGE/8HITiIV9mlU/s72-c/IMG_0011.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-216596213469116141</id><published>2009-10-29T14:17:00.000-07:00</published><updated>2009-10-29T14:18:33.887-07:00</updated><title type='text'>NSNull</title><content type='html'>从JSon中传过来的数据&lt;br /&gt;&lt;br /&gt;        ID = 6;&lt;br /&gt;        currentStatus = "Assert Demand";&lt;br /&gt;        driver = &lt;null&gt;;&lt;br /&gt;        fromAddress = Belgooly;&lt;br /&gt;        fromLat = 51.7360386044182;&lt;br /&gt;        fromLon = -8.48393440246582;&lt;br /&gt;        pin = &lt;null&gt;;&lt;br /&gt;        seat = 3;&lt;br /&gt;        startTime = -2147484000;&lt;br /&gt;        toAddress = KCP;&lt;br /&gt;        toLat = 51.7094938361641;&lt;br /&gt;        toLon = -8.51498365402222;&lt;br /&gt;        vehicle = &lt;null&gt;;&lt;br /&gt;如何判断为&lt;null&gt;&lt;br /&gt;用［NSNull null］判断&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-216596213469116141?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/216596213469116141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/10/nsnull.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/216596213469116141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/216596213469116141'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/10/nsnull.html' title='NSNull'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-8034403135595184111</id><published>2009-10-29T04:44:00.000-07:00</published><updated>2009-10-29T05:08:16.643-07:00</updated><title type='text'>NavigationItem浅析</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fAv06gZ6FPU/SumA5OOAbPI/AAAAAAAAAFU/wdxYx0vXgl0/s1600-h/Screen+shot+2009-10-29+at+11.45.32.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 44px;" src="http://4.bp.blogspot.com/_fAv06gZ6FPU/SumA5OOAbPI/AAAAAAAAAFU/wdxYx0vXgl0/s320/Screen+shot+2009-10-29+at+11.45.32.png" alt="" id="BLOGGER_PHOTO_ID_5397987348937993458" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;NavigationBar是我们经常用到的iPhone控键。此控键的左右两边常常会有一些方便的按钮，在下看来这个设计是iPhone整个界面系统最为杰出的设计之一。它有效的利用了不算富裕的iPhone屏幕，而且置于NavigationBar两端的NavigationItems对于用户操作性而言是相当方便的。&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fAv06gZ6FPU/SumBu89nOsI/AAAAAAAAAFc/XvAO-_Uy2P4/s1600-h/Screen+shot+2009-10-29+at+11.45.47.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 84px; height: 33px;" src="http://2.bp.blogspot.com/_fAv06gZ6FPU/SumBu89nOsI/AAAAAAAAAFc/XvAO-_Uy2P4/s320/Screen+shot+2009-10-29+at+11.45.47.png" alt="" id="BLOGGER_PHOTO_ID_5397988272018766530" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fAv06gZ6FPU/SumCCleuwpI/AAAAAAAAAFs/0mtPapm8EFg/s1600-h/Screen+shot+2009-10-29+at+11.47.20.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 47px; height: 33px;" src="http://4.bp.blogspot.com/_fAv06gZ6FPU/SumCCleuwpI/AAAAAAAAAFs/0mtPapm8EFg/s200/Screen+shot+2009-10-29+at+11.47.20.png" alt="" id="BLOGGER_PHOTO_ID_5397988609312604818" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fAv06gZ6FPU/SumB20Jz_cI/AAAAAAAAAFk/fOV30rS3v7E/s1600-h/Screen+shot+2009-10-29+at+11.46.03.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 58px; height: 35px;" src="http://2.bp.blogspot.com/_fAv06gZ6FPU/SumB20Jz_cI/AAAAAAAAAFk/fOV30rS3v7E/s320/Screen+shot+2009-10-29+at+11.46.03.png" alt="" id="BLOGGER_PHOTO_ID_5397988407092968898" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fAv06gZ6FPU/SumCUUlQccI/AAAAAAAAAF0/5yacsMaOifQ/s1600-h/Screen+shot+2009-10-29+at+11.45.55.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 67px; height: 34px;" src="http://1.bp.blogspot.com/_fAv06gZ6FPU/SumCUUlQccI/AAAAAAAAAF0/5yacsMaOifQ/s200/Screen+shot+2009-10-29+at+11.45.55.png" alt="" id="BLOGGER_PHOTO_ID_5397988914014220738" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;以上就是一些常用的NavigationItems&lt;br /&gt;左上带尖角的"Book Ride"其实是一个backBarButton默认下是显示上一个View的title&lt;br /&gt;当然你也可以通过以下代码修改backBarButton的Title切记&lt;span style="color: rgb(255, 0, 0);"&gt;target:nil action:nil&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;。&lt;br /&gt;特别的是，此&lt;/span&gt;backBarButton控键是上一个View的属性，再下一个bushed View中显示，&lt;br /&gt;当然如果你在下一个view中override了leftBarButtonItem 那么次控键将会自动被覆盖。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;// Init the back button&lt;br /&gt;  UIBarButtonItem *backBarButtonItem = [[[UIBarButtonItem alloc]&lt;br /&gt;                                                                                              initWithTitle:@"Book   Ride"&lt;br /&gt;                                                                                              style:UIBarButtonItemStylePlain&lt;br /&gt;                                                                                              target:nil action:nil] autorelease];&lt;br /&gt;  self.navigationItem.backBarButtonItem = backBarButtonItem;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;中间的“Home”是一个普通的 leftBarButtonItem&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;// Init the left button&lt;br /&gt; UIBarButtonItem *leftBarButtonItem = [[[UIBarButtonItem alloc]        &lt;br /&gt;         initWithTitle:@"Home"&lt;br /&gt;         style:UIBarButtonItemStylePlain&lt;br /&gt;                          target:self action:@selector(cancelAction)] autorelease];&lt;br /&gt;  self.navigationItem.leftBarButtonItem = leftBarButtonItem;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;右边的"Compose"是一个系统模式的的rightBarButtonItem控贱，系统自带图表有很多种选择&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;UIBarButtonItem *barButton = [[UIBarButtonItem alloc] &lt;br /&gt;         initWithBarButtonSystemItem:UIBarButtonSystemItemCompose &lt;br /&gt;         target:self action:@selector(compose:)];&lt;br /&gt; self.navigationItem.rightBarButtonItem = barButton;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;左下的黄色"Done"控键其实是一个 Custom 的自定义 rightBarButtonItem&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;// init the done Button &lt;br /&gt; UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];&lt;br /&gt; doneButton.frame = CGRectMake(0.0, 0.0, 60.0, 30.0);&lt;br /&gt; [doneButton setTitle:@"Done" forState:UIControlStateNormal];&lt;br /&gt; [doneButton setTitleColor:BUTTON_TITLE_COLOR forState:UIControlStateNormal];&lt;br /&gt; [doneButton setBackgroundImage:[UIImage imageNamed:@"bg-principalbtn-curves.png"] forState:UIControlStateNormal];&lt;br /&gt; [doneButton addTarget:self action:@selector(doneActive) forControlEvents:UIControlEventTouchUpInside];&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-8034403135595184111?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/8034403135595184111/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/10/navigationitem.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/8034403135595184111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/8034403135595184111'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/10/navigationitem.html' title='NavigationItem浅析'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_fAv06gZ6FPU/SumA5OOAbPI/AAAAAAAAAFU/wdxYx0vXgl0/s72-c/Screen+shot+2009-10-29+at+11.45.32.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-1360981760909360655</id><published>2009-10-28T16:50:00.000-07:00</published><updated>2009-10-28T16:52:58.892-07:00</updated><title type='text'>计算机科学与技术反思录（转至考研论坛，曾被CSDN顶置）</title><content type='html'>计算机科学与技术这一门科学深深的吸引着我们这些同学们，上计算机系已经有近三年了，自己也做了一些思考,我一直认为计算机科学与技术这门专业，在本科阶段是不可能切分成计算机科学和计算机技术的，因为计算机科学需要相当多的实践，而实践需要技术；每一个人(包括非计算机专业)，掌握简单的计算机技术都很容易（包括程序设计），但计算机专业的优势就在于，我们掌握许多其他专业并不“深究”的东西，例如，算法，体系结构，等等。非计算机专业的人可以很容易地做一个芯片，写一段程序，但他们做不出计算机专业能够做出来的大型系统。今天我想专门谈一谈计算机科学，并将重点放在计算理论上。&lt;br /&gt;  &lt;br /&gt;计算机理论的一个核心问题——从数学谈起：&lt;br /&gt;    记得当年大一入学，每周六课时高等数学，天天作业不断(那时是六日工作制)。颇有些同学惊呼走错了门:咱们这到底念的是什么系？不错，你没走错门，这就是计算机科学与技术系。我国计算机科学系里的传统是培养做学术研究，尤其是理论研究的人（方向不见得有问题，但是做得不是那么尽如人意）。而计算机的理论研究，说到底了，如网络安全，图形图像学，视频音频处理，哪个方向都与数学有着很大的关系，虽然也许是正统数学家眼里非主流的数学。这里我还想阐明我的一个观点：我们都知道，数学是从实际生活当中抽象出来的理论，人们之所以要将实际抽象成理论，目的就在于想用抽象出来的理论去更好的指导实践，有些数学研究工作者喜欢用一些现存的理论知识去推导若干条推论，殊不知其一：问题考虑不全很可能是个错误的推论，其二：他的推论在现实生活中找不到原型，不能指导实践。严格的说，我并不是一个理想主义者，政治课上学的理论联系实际一直是指导我学习科学文化知识的航标（至少我认为搞计算机科学与技术的应当本着这个方向）。&lt;br /&gt;   &lt;br /&gt;   其实我们计算机系学数学光学高等数学是不够的（典型的工科院校一般都开的是高等数学），我们应该像数学系一样学一下数学分析（清华计算机系开的好像就是数学分析），数学分析这门科学，咱们学计算机的人对它有很复杂的感情。在于它是偏向于证明型的数学课程，这对我们培养良好的分析能力极有帮助。我的软件工程学导师北工大数理学院的王仪华先生就曾经教导过我们，数学系的学生到软件企业中大多作软件设计与分析工作，而计算机系的学生做程序员的居多，原因就在于数学系的学生分析推理能力，从所受训练的角度上要远远在我们之上。当年出现的怪现象是：计算机系学生的高中数学基础在全校数一数二(希望没有冒犯其它系的同学)，教学课时数也仅次于数学系，但学完之后的效果却不尽如人意。难道都是学生不努力吗，我看未见得，方向错了也说不一定，其中原因何在，发人深思。&lt;br /&gt;&lt;br /&gt;   我个人的浅见是：计算机系的学生，对数学的要求固然跟数学系不同，跟物理类差别则更大。通常非数学专业的所谓“高等数学”，无非是把数学分析中较困难的理论部分删去，强调套用公式计算而已。而对计算机系来说，数学分析里用处最大的恰恰是被删去的理论部分。说得难听一点，对计算机系学生而言，追求算来算去的所谓“工程数学”已经彻底地走进了误区。记上一堆曲面积分的公式，难道就能算懂了数学？那倒不如现用现查，何必费事记呢？再不然直接用 Mathematics或是Matalab好了。&lt;br /&gt;   &lt;br /&gt;   我在系里最爱做的事情就是给学弟学妹们推荐参考书。中文的数学分析书，一般都认为以北大张筑生老师的“数学分析新讲”为最好。万一你的数学实在太好，那就去看菲赫金哥尔茨的“微积分学教程”好了--但我认为没什么必要，毕竟你不想转到数学系去。吉米多维奇的“数学分析习题集”也基本上是计算型的东东。书的名气很大，倒不见得适合我们，还是那句话，重要的是数学思想的建立，生活在信息社会里我们求的是高效，计算这玩意还是留给计算机吧。不过现在多用的似乎是复旦大学的《数学分析》也是很好的教材。&lt;br /&gt;&lt;br /&gt;   中国的所谓高等代数，就等于线性代数加上一点多项式理论。我以为这有好的一面，因为可以让学生较早感觉到代数是一种结构，而非一堆矩阵翻来覆去。这里不得不提南京大学林成森，盛松柏两位老师编的“高等代数”，感觉相当舒服。此书相当全面地包含了关于多项式和线性代数的基本初等结果，同时还提供了一些有用的又比较深刻的内容，如Sturm序列，Shermon-Morrison公式，广义逆矩阵等等。可以说，作为本科生如能吃透此书，就可以算高手。国内较好的高等代数教材还有清华计算机系用的那本，清华出版社出版，书店里多多，一看就知道。从抽象代数的观点来看，高等代数里的结果不过是代数系统性质的一些例子而已。莫宗坚先生的《代数学》里，对此进行了深刻的讨论。然而莫先生的书实在深得很，作为本科生恐怕难以接受，不妨等到自己以后成熟了一些再读。&lt;br /&gt;   &lt;br /&gt;   正如上面所论述的，计算机系的学生学习高等数学：知其然更要知其所以然。你学习的目的应该是：将抽象的理论再应用于实践，不但要掌握题目的解题方法，更要掌握解题思想，对于定理的学习：不是简单的应用，而是掌握证明过程即掌握定理的由来，训练自己的推理能力。只有这样才达到了学习这门科学的目的，同时也缩小了我们与数学系的同学之间思维上的差距。&lt;br /&gt;   &lt;br /&gt;   概率论与数理统计这门课很重要，可惜大多数院校讲授这门课都会少些东西。少了的东西现在看至少有随机过程。到毕业还没有听说过Markov过程，此乃计算机系学生的耻辱。没有随机过程，你怎么分析网络和分布式系统？怎么设计随机化算法和协议？据说清华计算机系开有“随机数学”，早就是必修课。另外，离散概率论对计算机系学生来说有特殊的重要性。而我们国家工程数学讲的都是连续概率。现在，美国已经有些学校开设了单纯的“离散概率论”课程，干脆把连续概率删去，把离散概率讲深些。我们不一定要这么做，但应该更加强调离散概率是没有疑问的。这个工作我看还是尽早的做为好。&lt;br /&gt;   &lt;br /&gt;   计算方法学（有些学校也称为数学分析学）是最后一门由数理学院给我们开的课。一般学生对这门课的重视程度有限，以为没什么用。不就是照套公式嘛！其实，做图形图像可离不开它，密码学搞深了也离不开它。而且，在很多科学工程中的应用计算，都以数值的为主。这门课有两个极端的讲法：一个是古典的“数值分析”，完全讲数学原理和算法；另一个是现在日趋流行的“科学与工程计算”，干脆教学生用软件包编程。我个人认为，计算机系的学生一定要认识清楚我们计算机系的学生为什么要学这门课，我是很偏向于学好理论后用计算机实现的，最好使用C语言或C++编程实现。向这个方向努力的书籍还是挺多的，这里推荐大家高等教育出版社（CHEP）和施普林格出版社(Springer)联合出版的《计算方法（Computational Methods）》,华中理工大学数学系写的（现华中科技大学），这方面华科大做的工作在国内应算是比较多的，而个人认为以这本最好，至少程序设计方面涉及了：任意数学函数的求值，方程求根，线性方程组求解，插值方法，数值积分，场微分方程数值求解。李庆扬的那本则理论性过强，与实际应用结合得不太紧。&lt;br /&gt;&lt;br /&gt;   每个学校本系里都会开一门离散数学，涉及集合论，图论，和抽象代数，数理逻辑。不过，这么多内容挤在离散数学一门课里，是否时间太紧了点？另外，计算机系学生不懂组合和数论，也是巨大的缺陷。要做理论，不懂组合或者数论吃亏可就太大了。从理想的状态来看，最好分开六门课：集合，逻辑,图论，组合，代数，数论。这个当然不现实，因为没那么多课时。也许将来可以开三门课：集合与逻辑，图论与组合，代数与数论。（这方面我们学校已经着手开始做了）不管课怎么开，学生总一样要学。下面分别谈谈上面的三组内容。&lt;br /&gt;   古典集合论，北师大出过一本《基础集合论》不错。数理逻辑，中科院软件所陆钟万教授的《面向计算机科学的数理逻辑》就不错。现在可以找到陆钟万教授的讲课录像，http://www.cas.ac.cn /html/Dir/2001/11/06/3391.htm自己去看看吧。总的来说，学集合/逻辑起手不难，普通高中生都能看懂。但越往后越感觉深不可测。&lt;br /&gt;   &lt;br /&gt;   学完以上各书之后，如果你还有精力兴趣进一步深究，那么可以试一下GTM系列中的《Introduction to Axiomatic Set Theory》和《A Course of Mathematical Logic》。这两本都有世界图书出版社的引进版。你如果能搞定这两本，可以说在逻辑方面真正入了门，也就不用再浪费时间听我瞎侃了。&lt;br /&gt;   &lt;br /&gt;   据说全中国最多只有三十个人懂图论。此言不虚。图论这东东，技巧性太强，几乎每个问题都有一个独特的方法，让人头痛。不过这也正是它魅力所在：只要你有创造性，它就能给你成就感。我的导师说，图论里面随便揪一块东西就可以写篇论文。大家可以体会里面内容之深广了吧！国内的图论书中，王树禾老师的“图论及其算法”非常成功。一方面，其内容在国内教材里算非常全面的。另一方面，其对算法的强调非常适合计算机系(本来就是科大计算机系教材)。有了这本书为主，再参考几本翻译的，如Bondy &amp; Murty的《图论及其应用》，人民邮电出版社翻译的《图论和电路网络》等等，就马马虎虎，对本科生足够了。再进一步，世界图书引进有GTM系列的"Modern Graph Theory"。此书确实经典！国内好象还有一家出版了个翻译版。不过，学到这个层次，还是读原版好。搞定这本书，也标志着图论入了门。&lt;br /&gt;   &lt;br /&gt;   离散数学方面我们北京工业大学实验学院有个世界级的专家，叫邵学才，复旦大学概率论毕业的，教过高等数学，线性代数，概率论，最后转向离散数学，出版著作无数，论文集新加坡有一本，堪称经典，大家想学离散数学的真谛不妨找来看看。这老师的课我专门去听过，极为经典。不过你要从他的不经意的话中去挖掘精髓。在同他的交谈当中我又深刻地发现一个问题，虽说邵先生写书无数，但依他自己的说法每本都差不多，我实在觉得诧异，他说主要是有大纲的限制，不便多写。这就难怪了，很少听说国外写书还要依据个什么大纲（就算有，内容也宽泛的多），不敢越雷池半步，这样不是看谁的都一样了。外版的书好就好在这里，最新的科技成果里面都有论述，别的先不说，至少是“紧跟时代的理论知识”。&lt;br /&gt;   &lt;br /&gt;   组合感觉没有太适合的国产书。还是读Graham和Knuth等人合著的经典“具体数学”吧，西安电子科技大学出版社有翻译版。抽象代数，国内经典为莫宗坚先生的“代数学”。此书是北大数学系教材，深得好评。然而对本科生来说，此书未免太深。可以先学习一些其它的教材，然后再回头来看“代数学”。国际上的经典可就多了，GTM系列里就有一大堆。推荐一本谈不上经典，但却最简&lt;br /&gt;单的，最容易学的：http://www.math.miami.edu/~ec/book/这本“Introduction to Linear and Abstract Algebra"非常通俗易懂，而且把抽象代数和线性代数结合起来，对初学者来说非常理想，我校比较牛的同学都有收藏。&lt;br /&gt;   &lt;br /&gt;   数论方面，国内有经典而且以困难著称的”初等数论“(潘氏兄弟著，北大版)。再追溯一点，还有更加经典(可以算世界级)并且更加困难的”数论导引“(华罗庚先生的名著，科学版，九章书店重印，繁体的看起来可能比较困难)。把基础的几章搞定一个大概，对本科生来讲足够了。但这只是初等数论。本科毕业后要学计算数论，你必须看英文的书，如Bach的"Introduction to Algorithmic Number Theory"。&lt;br /&gt;计算机科学理论的根本，在于算法。现在很多系里给本科生开设算法设计与分析，确实非常正确。环顾西方世界，大约没有一个三流以上计算机系不把算法作为必修的。算法教材目前公认以Corman等著的"Introduction to Algorithms"为最优。对入门而言，这一本已经足够，不需要再参考其它书。&lt;br /&gt;   &lt;br /&gt;   再说说形式语言与自动机。我看过北邮的教材，应该说写的还清楚。但是，有一点要强调：形式语言和自动机的作用主要在作为计算模型，而不是用来做编译。事实上，编译前端已经是死领域，没有任何open problems，北科大的班晓娟博士也曾经说过，编译的技术已相当成熟。如果为了这个，我们完全没必要去学形式语言--用用yacc什么的就完了。北邮的那本在国内还算比较好，但是在深度上，在跟可计算性的联系上都有较大的局限，现代感也不足。所以建议有兴趣的同学去读英文书，不过国内似乎没引进这方面的教材。可以去互动出版网上看一看。入门以后，把形式语言与自动机中定义的模型，和数理逻辑中用递归函数定义的模型比较一番，可以说非常有趣。现在才知道，什么叫“宫室之美，百官之富”！&lt;br /&gt;   &lt;br /&gt;   计算机科学和数学的关系有点奇怪。二三十年以前，计算机科学基本上还是数学的一个分支。而现在，计算机科学拥有广泛的研究领域和众多的研究人员，在很多方面反过来推动数学发展，从某种意义上可以说是孩子长得比妈妈还高了。但不管怎么样，这个孩子身上始终流着母亲的血液。这血液是the mathematical underpinning of computer science(计算机科学的数学基础)，也就是理论计算机科学。原来在东方大学城图书馆中曾经看过一本七十年代的译本（书皮都没了，可我就爱关注这种书），大概就叫《计算机数学》。那本书若是放在当时来讲决是一本好书，但现在看来，涵盖的范围还算广，深度则差了许多，不过推荐大一的学生倒可以看一看，至少可以使你的计算数学入入门。&lt;br /&gt;   &lt;br /&gt;   最常和理论计算机科学放在一起的一个词是什么？答：离散数学。这两者的关系是如此密切，以至于它们在不少场合下成为同义词。（这一点在前面的那本书中也有体现）传统上，数学是以分析为中心的。数学系的同学要学习三四个学期的数学分析，然后是复变函数，实变函数，泛函数等等。实变和泛函被很多人认为是现代数学的入门。在物理，化学，工程上应用的，也以分析为主。&lt;br /&gt;   &lt;br /&gt;   随着计算机科学的出现，一些以前不太受到重视的数学分支突然重要起来。人们发现，这些分支处理的数学对象与传统的分析有明显的区别：分析研究的问题解决方案是连续的，因而微分，积分成为基本的运算；而这些分支研究的对象是离散的，因而很少有机会进行此类的计算。人们从而称这些分支为“离散数学”。“离散数学”的名字越来越响亮，最后导致以分析为中心的传统数学分支被相对称为“连续数学”。&lt;br /&gt;   &lt;br /&gt;离散数学经过几十年发展，基本上稳定下来。一般认为，离散数学包含以下学科：&lt;br /&gt;1) 集合论，数理逻辑与元数学。这是整个数学的基础，也是计算机科学的基础。&lt;br /&gt;2) 图论，算法图论；组合数学，组合算法。计算机科学，尤其是理论计算机科学的核心是&lt;br /&gt;算法，而大量的算法建立在图和组合的基础上。&lt;br /&gt;3) 抽象代数。代数是无所不在的，本来在数学中就非常重要。在计算机科学中，人们惊讶地发现代数竟然有如此之多的应用。&lt;br /&gt;   &lt;br /&gt;但是，理论计算机科学仅仅就是在数学的上面加上“离散”的帽子这么简单吗？一直到大约十几年前，终于有一位大师告诉我们：不是。D.E.Knuth(他有多伟大，我想不用我废话了)在Stanford开设了一门全新的课程Concrete Mathematics。 Concrete这个词在这里有两层含义：&lt;br /&gt;首先：对abstract而言。Knuth认为，传统数学研究的对象过于抽象，导致对具体的问题关心不够。他抱怨说，在研究中他需要的数学往往并不存在，所以他只能自己去创造一些数学。为了直接面向应用的需要，他要提倡“具体”的数学。在这里我做一点简单的解释。例如在集合论中，数学家关心的都是最根本的问题--公理系统的各种性质之类。而一些具体集合的性质，各种常见集合，关系，映射都是什么样的，数学家觉得并不重要。然而，在计算机科学中应用的，恰恰就是这些具体的东西。Knuth能够首先看到这一点，不愧为当世计算机第一人。其次，Concrete是Continuous(连续)加上 discrete(离散)。不管连续数学还是离散数学，都是有用的数学！&lt;br /&gt;   &lt;br /&gt;理论与实际的结合——计算机科学研究的范畴&lt;br /&gt;    前面主要是从数学角度来看的。从计算机角度来看，理论计算机科学目前主要的研究领域包括：可计算性理论，算法设计与复杂性分析，密码学与信息安全，分布式计算理论，并行计算理论，网络理论，生物信息计算，计算几何学，程序语言理论等等。这些领域互相交叉，而且新的课题在不断提出，所以很难理出一个头绪来。想搞搞这方面的工作，推荐看中国计算机学会的一系列书籍，至少代表了我国的权威。下面随便举一些例子。&lt;br /&gt;    由于应用需求的推动，密码学现在成为研究的热点。密码学建立在数论(尤其是计算数论)，代数，信息论，概率论和随机过程的基础上，有时也用到图论和组合学等。很多人以为密码学就是加密解密，而加密就是用一个函数把数据打乱。这样的理解太浅显了。&lt;br /&gt;现代密码学至少包含以下层次的内容：&lt;br /&gt;第一，密码学的基础。例如，分解一个大数真的很困难吗？能否有一般的工具证明协议正确？&lt;br /&gt;第二，密码学的基本课题。例如，比以前更好的单向函数，签名协议等。&lt;br /&gt;第三，密码学的高级问题。例如，零知识证明的长度，秘密分享的方法。&lt;br /&gt;第四，密码学的新应用。例如，数字现金，叛徒追踪等。&lt;br /&gt;在分布式系统中，也有很多重要的理论问题。例如，进程之间的同步，互斥协议。一个经典的结果是：在通信信道不可靠时，没有确定型算法能实现进程间协同。所以，改进TCP三次握手几乎没有意义。例如时序问题。常用的一种序是因果序，但因果序直到不久前才有一个理论上的结果....例如，死锁没有实用的方法能完美地对付。例如,......操作系统研究过就自己去举吧！&lt;br /&gt;    如果计算机只有理论，那么它不过是数学的一个分支，而不成为一门独立的科学。事实上，在理论之外，计算机科学还有更广阔的天空。   &lt;br /&gt;   &lt;br /&gt;我一直认为，4年根本不够学习计算机的基础知识，因为面太宽了......&lt;br /&gt;    这方面我想先说说我们系在各校普遍开设的《计算机基础》。在高等学校开设《计算机基础课程》是我国高教司明文规定的各专业必修课程要求。主要内容是使学生初步掌握计算机的发展历史，学会简单的使用操作系统，文字处理，表格处理功能和初步的网络应用功能。但是在计算机科学系教授此门课程的目标决不能与此一致。在计算机系课程中目标应是：让学生较为全面的了解计算机学科的发展，清晰的把握计算机学科研究的方向，发展的前沿即每一个课程在整个学科体系中所处的地位。搞清各学科的学习目的，学习内容，应用领域。使学生在学科学习初期就对整个学科有一个整体的认识，以做到在今后的学习中清楚要学什么，怎么学。计算机基本应用技能的位置应当放在第二位或更靠后，因为这一点对于本系的学生应当有这个摸索能力。这一点很重要。推荐给大家一本书：机械工业出版社的《计算机文化》（New Perspective of Computer Science），看了这本书我才深刻的体会到自己还是个计算机科学初学者，才比较透彻的了解了什么是计算机科学。另外在厦门大学赵致琢老师的著作《计算科学导论》当中的很多经典理论都是在同类书籍中很难找到的。看看他也许你才会明白一个最基本的问题：为什么计算机科学叫计算科学更为准确。这本书在世界上也可成为精品级的著作。&lt;br /&gt;   &lt;br /&gt;一个一流计算机系的优秀学生决不该仅仅是一个编程高手，但他一定首先是一个编程高手。我上大学的时候，第一门专业课是C语言程序设计，念计算机的人从某种角度讲相当一部分人是靠写程序吃饭的。在我们北京工业大学实验学院计算机系里一直有这样的争论（时至今日CSDN上也有），关于第一程序设计语言该用哪一种。我个人认为，用哪种语言属于末节，关键在养成良好的编程习惯。当年老师对我们说，打好基础后学一门新语言只要一个星期。现在我觉得根本不用一个星期，前提是先把基础打好。不要再犹豫了，学了再说，等你抉择好了，别人已经会了几门语言了。&lt;br /&gt;   &lt;br /&gt;汇编语言和微机原理是两门特烦人的课。你的数学/理论基础再好，也占不到什么便宜。这两门课之间的次序也好比先有鸡还是先有蛋，无论你先学哪门，都会牵扯另一门课里的东西。所以，只能静下来慢慢琢磨。这就是典型的工程课，不需要太多的聪明和顿悟，却需要水滴石穿的渐悟。有关这两门课的书，计算机书店里不难找到。弄几本最新的，对照着看吧。组成原理推荐《计算机组成与结构》清华大学王爱英教授写的。汇编语言大家拿8086/8088入个门，之后一定要学 80x86汇编语言。实用价值大，不落后，结构又好，写写高效病毒，高级语言里嵌一点汇编，进行底层开发，总也离不开他，推荐清华大学沈美明的《IBM— PC汇编语言程序设计》。有些人说不想了解计算机体系结构，也不想制造计算机，所以诸如计算机原理，汇编语言，接口之类的课觉得没必要学，这样合理吗？显然不合理，这些东西迟早得掌握，肯定得接触，而且，这是计算机专业与其他专业学生相比的少有的几项优势。做项目的时候，了解这些是非常重要的，不可能说，仅仅为了技术而技术，只懂技术的人最多做一个编码工人，而永远不可能全面地了解整个系统的设计，而编码工人是越老越不值钱。关于组成原理还有个讲授的问题，在我学这门课程时老师讲授时把CPU工作原理誉微程序设计这一块略掉了，理由是我们国家搞CPU技术不如别的国家，搞了这么长时间好不容易出了个龙芯比Intel的还差个十万八千里，所以建议我们不要学了。我看这在各校也未见得不是个问题吧！若真是如他所说，那中国的计算机科学哪个方向都可以停了，软硬件，应用，有几项搞得过美国，搞不过别人就不搞了，那我们坐在这里干什么？教学的观念需要转变的。&lt;br /&gt;   &lt;br /&gt;模拟电路这东东，如今不仅计算机系学生搞不定，电子系学生也多半害怕。如果你真想软硬件通吃，那么建议你先看看邱关源的“电路原理”，也许此后再看模拟电路底气会足些。教材：康华光的“电子技术基础”（高等教育出版社）还是不错的（我校电子系在用）。有兴趣也可以参考童诗白的书。&lt;br /&gt;   &lt;br /&gt;数字电路比模拟电路要好懂得多。推荐大家看一看我们北工大刘英娴教授写的《数字逻辑》业绩人士都说这本书很有参考价值（机械工业出版社的）。原因很明了，实用价值高，能听听她讲授的课程更是有一种“享受科学”的感觉。清华大学阎石的书也算一本好教材，遗憾的一点是集成电路讲少了些。真有兴趣，看一看大规模数字系统设计吧（北航那本用的还比较多）。&lt;br /&gt;   &lt;br /&gt;计算机系统结构该怎么教，国际上还在争论。国内能找到的较好教材为Stallings的"Computer Organization and Architectureesigning for Performance"(清华影印&lt;br /&gt;本)。国际上最流行的则是“Computer architecture: aquantitative approach", by Patterson &amp; Hennessy。&lt;br /&gt;    操作系统可以随便选用《操作系统的内核设计与实现》和《现代操作系统》两书之一。这两部都可以算经典，唯一缺点就是理论上不够严格。不过这领域属于 Hardcore System,所以在理论上马虎一点也情有可原。想看理论方面的就推荐清华大学出版社《操作系统》吧，高教司司长张尧学写的，我们教材用的是那本。另外推荐一本《Windows操作系统原理》机械工业出版社的，这本书是我国操作系统专家在微软零距离考察半年，写作历时一年多写成的，教操作系统的专家除了清华大学的张尧学（现高教司司长）几乎所有人都参加了。Bill Gates亲自写序。里面不但结合windows2000,xp详述操作系统的内核，而且后面讲了一些windows编程基础，有外版书的味道，而且上面一些内容可以说在国内外只有那本书才有对windows内核细致入微的介绍，&lt;br /&gt;    如果先把形式语言学好了，则编译原理中的前端我看只要学四个算法：最容易实现的递归下降；最好的自顶向下算法LL(k)；最好的自底向上算法 LR(k)；LR(1)的简化SLR(也许还有另一简化LALR)。后端完全属于工程性质，自然又是another story。&lt;br /&gt;推荐教材：Kenneth C.Louden写的“Compiler Construction Principles and Practice”即是《编译原理及实践》（机械工业出版社的译本）&lt;br /&gt;    学数据库要提醒大家的是，会用VFP，VB, Power builder不等于懂数据库。(这世界上自以为懂数据库的人太多了！)数据库设计既是科学又是艺术，数据库实现则是典型的工程。所以从某种意义上讲，数据库是最典型的一门计算机课程——理工结合，互相渗透。另外推荐大家学完软件工程学后再翻过来看看数据库技术，又会是一番新感觉。推荐教材：Abraham Silberschatz等著的 "Database System Concepts".作为知识的完整性，还推荐大家看一看机械工业出版社的《数据仓库》译本。&lt;br /&gt;   &lt;br /&gt;计算机网络的标准教材还是来自Tanenbaum的《Computer Networks》（清华大学有译本）。还有就是推荐谢希仁的《计算机网络教程》（人民邮电出版社）问题讲得比较清楚，参考文献也比较权威。不过，网络也属于Hardcore System，所以光看书是不够的。建议多读RFC，http://www.ietf.org/rfc.htm里可以按编号下载RFC文档。从IP的读起。等到能掌握10种左右常用协议，就没有几个人敢小看你了。再做的工作我看放在网络设计上就比较好了。&lt;br /&gt;   &lt;br /&gt;数据结构的重要性就不言而喻了，学完数据结构你会对你的编程思想进行一番革命性的洗礼，会对如何建立一个合理高效的算法有一个清楚的认识。对于算法的建立我想大家应当注意以下几点：&lt;br /&gt;当遇到一个算法问题时,首先要知道自己以前有没有处理过这种问题.如果见过,那么你一般会顺利地做出来;如果没见过,那么考虑以下问题:&lt;br /&gt;1. 问题是否是建立在某种已知的熟悉的数据结构(例如,二叉树)上?如果不是,则要自己设计数据结构。&lt;br /&gt;2. 问题所要求编写的算法属于以下哪种类型?(建立数据结构,修改数据结构,遍历,查找,排序...)&lt;br /&gt;3. 分析问题所要求编写的算法的数学性质.是否具备递归特征?(对于递归程序设计,只要设计出合理的参数表以及递归结束的条件,则基本上大功告成.)&lt;br /&gt;4. 继续分析问题的数学本质.根据你以前的编程经验,设想一种可能是可行的解决办法,并证明这种解决办法的正确性.如果题目对算法有时空方面的要求,证明你的设想满足其要求.一般的,时间效率和空间效率难以兼得.有时必须通过建立辅助存储的方法来节省时间.&lt;br /&gt;5. 通过一段时间的分析,你对解决这个问题已经有了自己的一些思路.或者说,你已经可以用自然语言把你的算法简单描述出来.继续验证其正确性,努力发现其中的错误并找出解决办法.在必要的时候(发现了无法解决的矛盾),推翻自己的思路,从头开始构思.&lt;br /&gt;6. 确认你的思路可行以后,开始编写程序.在编写代码的过程中,尽可能把各种问题考虑得详细,周密.程序应该具有良好的结构,并且在关键的地方配有注释.&lt;br /&gt;7. 举一个例子,然后在纸上用笔执行你的程序,进一步验证其正确性.当遇到与你的设想不符的情况时,分析问题产生的原因是编程方面的问题还是算法思想本身有问题.&lt;br /&gt;8. 如果程序通过了上述正确性验证,那么在将其进一步优化或简化。&lt;br /&gt;9. 撰写思路分析,注释.&lt;br /&gt;对于具体的算法思路,只能靠你自己通过自己的知识和经验来加以获得,没有什么特定的规律(否则程序员全部可以下岗了,用机器自动生成代码就可以了).要有丰富的想象力,就是说当一条路走不通时,不要钻牛角尖,要敢于推翻自己的想法.我也只不过是初学者,说出上面的一些经验,仅供大家参考和讨论。&lt;br /&gt;    关于人工智能，我觉得的也是非常值得大家仔细研究的，虽然不能算是刚刚兴起的学科了，但是绝对是非常有发展前途的一门学科。我国人工智能创始人之一，北京科技大学涂序彦教授（这老先生是我的导师李小坚博士的导师）对人工智能这样定义：人工智能是模仿、延伸和扩展人与自然的智能的技术科学。在美国人工智能官方教育网站上对人工智能作了如下定义：Artificial Intelligence, or AI for short, is a combination of computer science, physiology, and philosophy. AI is a broad topic, consisting of different fields, from machine vision to expert systems. The element that the fields of AI have in common is the creation of machines that can "think".&lt;br /&gt;    这门学科研究的问题大概说有：&lt;br /&gt;（1）符号主义： 符号计算与程序设计基础，知识表达方法 ：知识与思维，产生式规则，语意网络，一阶谓词逻辑问题求解方法：搜索策略，启发式搜寻，搜寻算法，问题规约方法，谓词演算：归结原理，归结过程专家系统：建立专家系统的方法及工具&lt;br /&gt;（2）联接主义（神经网络学派）：1988年美国权威机构指出：数据库，网络发展呈直线上升，神经网络可能是解决人工智能的唯一途径。&lt;br /&gt;   我想对于人工智能的学习，大家一定不要像学数学似的及一些现成的结论，要学会分析问题，最好能利用程序设计实现，这里推荐给大家ACM最佳博士论文奖获得者涂晓媛博士的著作《人工鱼—计算机动画的人工生命方法》（清华大学出版社）。搞人工生命的同学不会不知道国际知名的涂氏父女吧。关于人工智能的书当然首选《Artificial Intelligence A New Synthesis》Nils J.Nilsson.鼻祖嘛！&lt;br /&gt;关于网络安全我也想在这里说两句，随着计算机技术的发展，整个社会的信息化水平突飞猛进，计算机网络技术日新月异，网络成了当即社会各个工作领域不可缺少的组成部分，只要有网络存在，网络安全问题就是一个必须解决好的问题，学习网络安全不是简简单单的收集一些黑客工具黑一黑别人的网站，而是要学习他的数学原理，实现原理，搞清底层工作机制，这样才能解决大部分的现有问题和新出现的安全问题。&lt;br /&gt;   &lt;br /&gt;关于计算机科学的一些边缘科学我想谈一谈软件工程技术，对于一个企业，推出软件是不是就是几个程序员坐在一起，你写一段程序，我写一段程序呢？显然不是。软件工程是典型的计算机科学和数学，管理科学，心理学，社会学等学科的综合。它使我们这些搞理论和技术的人进入了一个社会。你所要考虑的不仅仅是程序的优劣，更应该考虑程序与软件的区别，软件与软件产品的区别，软件软件产品的市场前景，如何去更好的与人交流。这方面我还在学习阶段，以后这方面再写文章吧，先推荐给大家几本书：畅销20年不衰的《人月神话》（清华大学中文版，中国电力出版社影印版），《软件工程-实践者研究的方法》（机械工业出版社译本），《人件》（据说每一位微软公司的部门经理都读过这本书，推荐老总们和想当老总的同学都看看，了解一下什么是软件企业中的人）以及微软公司的《软件开发的科学与艺术》和《软件企业的管理与文化》（研究软件企业的制胜之道当然要研究微软的成功经验了！）&lt;br /&gt;   &lt;br /&gt;关于计算机技术的学习我想是这样的：学校开设的任何一门科学都有其滞后性，不要总认为自己掌握的某门技术就已经是天下无敌手了，虽然现在 Java,VB,C,C++用的都很多，怎能保证没有被淘汰的一天，我想.NET平台的诞生和X#语言的初见端倪完全可以说明问题。换言之，在我们掌握一门新技术的同时就又有更新的技术产生，身为当代的大学生应当有紧跟科学发展的素质。举个例子，就像有些同学总说，我做网页设计就喜欢直接写html，不愿意用什么Frontpage,Dreamweaver。能用语言写网页固然很好，但有高效的手段你为什么不使呢？仅仅是为了显示自己的水平高，unique? 我看真正水平高的是能够以最快的速度接受新事物的人。高级程序设计语言的发展日新月异，今后的程序设计就像人们在说话一样，我想大家从xml中应是有所体会了。难道我们真就写个什么都要用汇编，以显示自己的水平高，真是这样倒不如直接用机器语言写算了。反过来说，想要以最快的速度接受并利用新技术关键还是在于你对计算机科学地把握程度。&lt;br /&gt;   &lt;br /&gt;计算机技术牵扯的内容更为广泛些，一项一项说恐怕没个一年半载也说不清。我只想提醒大家的还是那句话，技术与科学是不能分家的，学好了科学同时搞技术，这才是上上策。犹如英语，原先人们与老外交流必须要个翻译，现在满马路的人都会说英语。就连21世纪英语演讲比赛的冠军都轮不到英语系的学生了。计算机也是一样的，我们必须面对的一个现实就是：计算机真就只是一个工具，如果不具备其它方面的素养，计算机系的学生虽然不能说找不到工作，不过总有一天当其他专业性人才掌握了计算机技术后将比我们出色许多。原因就在于计算机解决的大都是实际问题，实际问题的知识却是我们少有的。单一的计算机技术没有立足之地。&lt;br /&gt;    我想是时候指出：学习每一个课程之前，都要先搞清这一课程的学习目的。这一学科的应用领域。据我自身所了解到的同龄同学和低年级的同学的学习状况：他们之中很少有人知道学一个学科的学习目的，期末考试结束了也不知道学这科做什么用。这就失去了读计算机科学的意义。当然这与现存的教育思想不能说一点关系都没有。&lt;br /&gt;总的来说，从教育角度来讲，国内高校的课程安排不是很合理，强调理论，又不愿意在理论上深入教育，无力接受新技术，想避开新技术又无法避得一干二净。我觉得关键问题就是国内的高校难于突破现状，条条框框限制着怎么求发展。我们虽然认识得到国外教育的优越性，但为什么迟迟不能采取行动？哪怕是去粗取精的取那么一点点。我们需要改变。从我们自身角度来讲，多数人4年下来既没有学习计算机科学的学术水平，也没有学习计算机技术的那种韧劲。在我刚上大一时，我的计算机科学入门导师，淮北煤炭师范学院王爱平教授曾经对我说过这样一番话：“当你选择了计算机这一门科学，就意味着你踏上了一条不归路，就意味着你一生都要为之奋斗……你的身后是悬崖，只有向前走，不能往后退。”&lt;br /&gt;    有些同学说按照这样学习学的东西太多，有的未见得有用，我想打个形象的比方：学校学出来的人都是一个球体，方方面面的知识都应具备。可是社会上需要球体的地方很少，反而需要的是砖和瓦，即精通某一行的人才。但是对于同等体积的物体，用球体来改造是最方便最省事的。学校的学生很多，为了能够使更多的学生来适应这个社会，学校也就不得以把所有的学生都打造成一个球体，然后让社会对这些学生进行再加工，成为真正能够有用的人才。即使你非常清楚自己的将来要干什么，并且非常下定决心要走自己的路，这一步你也必须走，世界是在不断变化的，你不能预料未来。想清楚，努力去干吧！&lt;br /&gt;必须结束这篇“胡侃”了，再侃下去非我力所能及。其实计算机还有很多基础课都值得一侃。怎奈我造诣有限，不敢再让内行耻笑。对于博大精深的计算机科学，我只能说我永远都是个Beginner.最后声明：这些只针对本科阶段的学习。即使把这些全弄通了，前面的路还长，计算机科学需要我们为之奋斗...... 学习计算机科学需要韧性，更需要创新，需要激情。深刻学习理论知识，勇于接受新技术的挑战，这才是我们这一代人应具有的素质。最后送大家一句话“Wake up every day with a feeling of passion for the difference technology will make in people's life!”。&lt;br /&gt;                                 &lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;在我大一时无意中找到了南京大学网友sir的帖子“胡侃（理论）计算机学习”，这个帖子对我的大学生活起了至关重要的作用，也因此同他成为了好友，本帖子在原有帖子的基础上改进了其中我认为不太合适的理论，修正了一些观点，在推荐教材方面结合我的学习情况有了较大改变。值得一提的是增加了一些计算机理论的内容，计算机技术的内容结合我国的教学情况和我们学习的实际情况进行了重写。感谢大家的支持，这篇文章才能比较快的完成，这里也只是写下了我在学习计算机科学时的所思所想，很不成熟。与原文相比增加了一些推荐参考书，删去了一些过陈旧的难以找到的材料。并且对一些问题作了更为详细地阐述，也增加了一些新观点。希望大家多多讨论，改进不足，让我们共同努力吧！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-1360981760909360655?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/1360981760909360655/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/10/csdn.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/1360981760909360655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/1360981760909360655'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/10/csdn.html' title='计算机科学与技术反思录（转至考研论坛，曾被CSDN顶置）'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-2336481642270783558</id><published>2009-10-28T15:32:00.000-07:00</published><updated>2009-10-28T16:06:33.689-07:00</updated><title type='text'>Memory performace</title><content type='html'>Loading Resource Lazily&lt;br /&gt;&lt;br /&gt;比如：&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;- (void) LoadBigImag &lt;br /&gt;{&lt;br /&gt;   if(myImage == nil){&lt;br /&gt;        myImage = [self loadSomeBigImageFromSource];&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;比如在viewWillAppear中，每次都要从网上图取一个图片&lt;br /&gt;检测如果该图片已经存在，就不做读取操作，这样可以有效的节约内存！&lt;br /&gt;&lt;br /&gt;Return carefully&lt;br /&gt;&lt;br /&gt;比如：&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;-(NSArray *) showSomething&lt;br /&gt;{&lt;br /&gt;     NSArray *myArray = [NSArray array];&lt;br /&gt;     NSArray *aArray = [[NSArray alloc] Init];&lt;br /&gt;     NSArray *bArray = [[NSArray alloc] Init];&lt;br /&gt;     if(myArray ...) &lt;br /&gt;     {&lt;br /&gt;        myArray = aArray;&lt;br /&gt;        [aArray release];&lt;br /&gt;        return myArray;  &lt;br /&gt;     }&lt;br /&gt;     .....&lt;br /&gt;     [aArray release];&lt;br /&gt;     [bArray release];&lt;br /&gt;     return myArray; &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;在if中因为某种情景提前返回了，而此时bArray并没有释放。。所以这个时候是会出现Memory leak的。&lt;br /&gt;所以一定要担心这样提前返回情况下出现的Memory leak。&lt;br /&gt;&lt;br /&gt;尽量不要用autorelease 因为会在短期内造成大量的内存占用&lt;br /&gt;不过如下可以用 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 解决这个问题&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;for (int i=0; i&lt;999999; i++){&lt;br /&gt;    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];&lt;br /&gt;    NSString *string = @"Memory Test";&lt;br /&gt;    string = [string lowercaseString];&lt;br /&gt;    string = [string stringByAppendingFormat:@"%d"];&lt;br /&gt;    [pool release];&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;在方法 -(void) didReceiveMemoryWarning {} 中释放可能造成内存问题的危险资源&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-2336481642270783558?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/2336481642270783558/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/10/memory-performace.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/2336481642270783558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/2336481642270783558'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/10/memory-performace.html' title='Memory performace'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-3616305834320482924</id><published>2009-10-28T15:01:00.000-07:00</published><updated>2009-10-28T15:09:08.525-07:00</updated><title type='text'>JSON(JavaScript Object Notation)</title><content type='html'>&lt;span style=""&gt;&lt;span style="color: rgb(198, 10, 0);"&gt;JSON&lt;/span&gt;(JavaScript Object Notation) 是一种简化的数据交换格式&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;我理解的JSON即把XML的简化&lt;br /&gt;&lt;br /&gt;用XML表示中国部分省市数据如下：&lt;br /&gt;&lt;br /&gt;　&lt;pre&gt;　&lt;br /&gt;　　&lt;.country&gt;&lt;br /&gt;　　&lt;.name&gt;中国&lt;./name&gt;&lt;br /&gt;　　&lt;.province&gt;&lt;br /&gt;　　&lt;.name&gt;黑龙江&lt;./name&gt;&lt;br /&gt;　　&lt;.citys&gt;&lt;br /&gt;　　&lt;.city&gt;哈尔滨&lt;./city&gt;&lt;br /&gt;　　&lt;.city&gt;大庆&lt;./city&gt;&lt;br /&gt;　　&lt;./citys&gt;&lt;br /&gt;　　&lt;./province&gt;&lt;br /&gt;　　&lt;.province&gt;&lt;br /&gt;　　&lt;.name&gt;广东&lt;./name&gt;&lt;br /&gt;　　&lt;.citys&gt;&lt;br /&gt;　　&lt;.city&gt;广州&lt;./city&gt;&lt;br /&gt;　　&lt;.city&gt;深圳&lt;./city&gt;&lt;br /&gt;　　&lt;.city&gt;珠海&lt;./city&gt;&lt;br /&gt;　　&lt;./citys&gt;&lt;br /&gt;　　&lt;./province&gt;&lt;br /&gt;　　&lt;.province&gt;&lt;br /&gt;　　&lt;.name&gt;台湾&lt;./name&gt;&lt;br /&gt;　　&lt;.citys&gt;&lt;br /&gt;　　&lt;.city&gt;台北&lt;./city&gt;&lt;br /&gt;　　&lt;.city&gt;高雄&lt;./city&gt;&lt;br /&gt;　　&lt;./citys&gt;&lt;br /&gt;　　&lt;./province&gt;&lt;br /&gt;　　&lt;.province&gt;&lt;br /&gt;　　&lt;.name&gt;新疆&lt;./name&gt;&lt;br /&gt;　　&lt;.citys&gt;&lt;br /&gt;　　&lt;.city&gt;乌鲁木齐&lt;./city&gt;&lt;br /&gt;　　&lt;./citys&gt;&lt;br /&gt;　　&lt;./province&gt;&lt;br /&gt;　　&lt;./country&gt;&lt;br /&gt;&lt;br /&gt;用JSON表示如下：&lt;br /&gt;&lt;br /&gt;　　{&lt;br /&gt;　　name:"中国",&lt;br /&gt;　　province:[&lt;br /&gt;　　{&lt;br /&gt;　　name:"黑龙江",&lt;br /&gt;　　citys:{&lt;br /&gt;　　city:["哈尔滨","大庆"]&lt;br /&gt;　　}&lt;br /&gt;　　},&lt;br /&gt;　　{&lt;br /&gt;　　name:"广东",&lt;br /&gt;　　citys:{&lt;br /&gt;　　city:["广州","深圳","珠海"]&lt;br /&gt;　　}&lt;br /&gt;　　},&lt;br /&gt;　　{&lt;br /&gt;　　name:"台湾",&lt;br /&gt;　　citys:{&lt;br /&gt;　　city:["台北","高雄"]&lt;br /&gt;　　}&lt;br /&gt;　　},&lt;br /&gt;　　{&lt;br /&gt;　　name:"新疆",&lt;br /&gt;　　citys:{&lt;br /&gt;　　city:["乌鲁木齐"]&lt;br /&gt;　　}&lt;br /&gt;　　}&lt;br /&gt;　　]&lt;br /&gt;　　}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-3616305834320482924?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/3616305834320482924/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/10/jsonjavascript-object-notation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/3616305834320482924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/3616305834320482924'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/10/jsonjavascript-object-notation.html' title='JSON(JavaScript Object Notation)'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-8137617111226432449</id><published>2009-10-23T03:52:00.001-07:00</published><updated>2009-10-23T03:53:43.274-07:00</updated><title type='text'>IT@Cork</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fAv06gZ6FPU/SuGLIHSMy1I/AAAAAAAAAFE/0TzBrx-JAOA/s1600-h/award.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 320px;" src="http://4.bp.blogspot.com/_fAv06gZ6FPU/SuGLIHSMy1I/AAAAAAAAAFE/0TzBrx-JAOA/s320/award.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5395746800077163346" /&gt;&lt;/a&gt;&lt;br /&gt;Congratulations to our 2009 Finalists&lt;br /&gt;&lt;br /&gt;Winners will be announced at a special ceremony on October 22&lt;br /&gt;&lt;br /&gt;The finalists in the Green Technology Category are:&lt;br /&gt;&lt;br /&gt;    * EMC&lt;br /&gt;    * Novartis Ringaskiddy&lt;br /&gt;    * Avego&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The finalists in the High Growth Company Category are:&lt;br /&gt;&lt;br /&gt;    * SouthWestern&lt;br /&gt;    * Cubic Telecom&lt;br /&gt;    * AMCS&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The finalists in the Sustained Excellence Category are:&lt;br /&gt;&lt;br /&gt;    * Eirteic Consulting&lt;br /&gt;    * PFH&lt;br /&gt;    * GxP Systems&lt;br /&gt;&lt;br /&gt;The finalists in the R&amp;D Project Category are:&lt;br /&gt;&lt;br /&gt;    * YouGetItBack&lt;br /&gt;    * Avego&lt;br /&gt;    * Newsweaver&lt;br /&gt;&lt;br /&gt;The finalists in the Excellence in Education category are:&lt;br /&gt;&lt;br /&gt;    * Knockaclarig National school, Rockchapel, Mallow, Co. Cork&lt;br /&gt;    * School of the Divine Child Lavanagh Centre, Ballintemple, Cork&lt;br /&gt;    * St. Patricks Boys National School, Mallow, Co. Cork&lt;br /&gt;&lt;br /&gt;The finalists in the IT Department Category are:&lt;br /&gt;&lt;br /&gt;    * CIT&lt;br /&gt;    * Musgrave&lt;br /&gt;    * Schering Plough&lt;br /&gt;&lt;br /&gt;The finalists in the High Potential Start-up Category are:&lt;br /&gt;&lt;br /&gt;    * ProcessMaster&lt;br /&gt;    * Avego&lt;br /&gt;    * WaveBreak Media&lt;br /&gt;&lt;br /&gt;Congratulations to all our finalists!&lt;br /&gt;&lt;br /&gt;http://www.itcork.ie/index.cfm?page=news&amp;newsId=1310&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-8137617111226432449?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/8137617111226432449/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/10/itcork.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/8137617111226432449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/8137617111226432449'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/10/itcork.html' title='IT@Cork'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_fAv06gZ6FPU/SuGLIHSMy1I/AAAAAAAAAFE/0TzBrx-JAOA/s72-c/award.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-4250499936218912459</id><published>2009-10-22T03:24:00.000-07:00</published><updated>2009-10-22T03:25:11.918-07:00</updated><title type='text'>Mac截图快捷键大全</title><content type='html'>在Mac上截图其实很简单，当然最基本的就是Command-Shift-3和Command-Shift-4，可是Mac的截图快捷键其实还有一些增强属性：&lt;br /&gt;&lt;br /&gt;1)Command-Shift-3: 将整个屏幕拍下并保存到桌面。&lt;br /&gt;2)Command-Shift-Control-3:将整个屏幕拍下并保存到剪贴板(Clipboard)，你可以Command+V直接粘贴到如Photoshop等软件中编辑。&lt;br /&gt;3)Command-Shift-4:将屏幕的一部分拍下并保存到桌面。按下这个组合键后，光标会变为一个十字，你可以拖拉来选取拍摄区域。&lt;br /&gt;4)Command-Shift-Control-4:将屏幕的一部分拍下并保存到剪贴板。&lt;br /&gt;5)Command-Shift-4再按空格键:这时光标会变为一个照相机图标，点击可拍下当前窗口或菜单或Dock以及图标等，只要将照相机图标移动到不同区域（有效区域会显示为浅蓝色）点击。&lt;br /&gt;6)Command-Shift-Control-4再按空格键:将选取的窗口或其他区域的快照保存到剪贴板。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-4250499936218912459?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/4250499936218912459/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/10/mac.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/4250499936218912459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/4250499936218912459'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/10/mac.html' title='Mac截图快捷键大全'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-4511272192115668274</id><published>2009-10-20T15:06:00.000-07:00</published><updated>2009-10-20T15:10:12.743-07:00</updated><title type='text'>CGRect 的 结构</title><content type='html'>CGRect 由 origin 和 size 两个属性组成&lt;br /&gt;常用的方法有 CGRectMake（x,y,height,width）&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fAv06gZ6FPU/St41ISCBIeI/AAAAAAAAAE0/BKbPKS8sGZw/s1600-h/Screen+shot+2009-10-20+at+23.06.17.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 204px;" src="http://3.bp.blogspot.com/_fAv06gZ6FPU/St41ISCBIeI/AAAAAAAAAE0/BKbPKS8sGZw/s320/Screen+shot+2009-10-20+at+23.06.17.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5394807820031959522" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fAv06gZ6FPU/St41OKq9erI/AAAAAAAAAE8/FjeKatksT3Q/s1600-h/Screen+shot+2009-10-20+at+23.06.30.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 162px;" src="http://2.bp.blogspot.com/_fAv06gZ6FPU/St41OKq9erI/AAAAAAAAAE8/FjeKatksT3Q/s320/Screen+shot+2009-10-20+at+23.06.30.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5394807921135418034" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-4511272192115668274?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/4511272192115668274/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/10/cgrectd.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/4511272192115668274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/4511272192115668274'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/10/cgrectd.html' title='CGRect 的 结构'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_fAv06gZ6FPU/St41ISCBIeI/AAAAAAAAAE0/BKbPKS8sGZw/s72-c/Screen+shot+2009-10-20+at+23.06.17.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-5336155538206379544</id><published>2009-10-19T13:38:00.000-07:00</published><updated>2009-10-19T13:42:36.967-07:00</updated><title type='text'>如果把build分离到项目文件夹之外</title><content type='html'>如何把Xcode项目每次运行之后的Build文件从项目文件夹剥离&lt;br /&gt;打开Xcode 的 Preferences，选择Building选项按照如下操作，当然你可以自己随便设置存放build文件的文件夹名&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fAv06gZ6FPU/StzOp7QrnPI/AAAAAAAAAEk/mbzvkgVrk08/s1600-h/Screen+shot+2009-10-19+at+21.36.29.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 250px;" src="http://1.bp.blogspot.com/_fAv06gZ6FPU/StzOp7QrnPI/AAAAAAAAAEk/mbzvkgVrk08/s320/Screen+shot+2009-10-19+at+21.36.29.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5394413673360628978" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;结果如下&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fAv06gZ6FPU/StzPLzoi4SI/AAAAAAAAAEs/MgwBVLQiUws/s1600-h/Screen+shot+2009-10-19+at+21.37.04.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 182px;" src="http://4.bp.blogspot.com/_fAv06gZ6FPU/StzPLzoi4SI/AAAAAAAAAEs/MgwBVLQiUws/s320/Screen+shot+2009-10-19+at+21.37.04.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5394414255428788514" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-5336155538206379544?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/5336155538206379544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/10/build.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5336155538206379544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/5336155538206379544'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/10/build.html' title='如果把build分离到项目文件夹之外'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_fAv06gZ6FPU/StzOp7QrnPI/AAAAAAAAAEk/mbzvkgVrk08/s72-c/Screen+shot+2009-10-19+at+21.36.29.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-6512767881853102941</id><published>2009-10-19T04:39:00.000-07:00</published><updated>2009-10-19T04:45:15.317-07:00</updated><title type='text'>如何在使用命令行更新SVN下项目里面的部分内容(Xcode)</title><content type='html'>打开Terminal 找到工程所在文件夹&lt;br /&gt;cd "目录"&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fAv06gZ6FPU/StxQqMaOnRI/AAAAAAAAAEU/mtJH7Xnkgq8/s1600-h/Screen+shot+2009-10-19+at+12.42.18.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 229px;" src="http://1.bp.blogspot.com/_fAv06gZ6FPU/StxQqMaOnRI/AAAAAAAAAEU/mtJH7Xnkgq8/s320/Screen+shot+2009-10-19+at+12.42.18.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5394275139498974482" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;找到项目中所要更新的文件夹，比如Images&lt;br /&gt;cd "目录"&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fAv06gZ6FPU/StxRHKCguCI/AAAAAAAAAEc/I6iIhCtYp9E/s1600-h/Screen+shot+2009-10-19+at+12.43.14.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 230px;" src="http://3.bp.blogspot.com/_fAv06gZ6FPU/StxRHKCguCI/AAAAAAAAAEc/I6iIhCtYp9E/s320/Screen+shot+2009-10-19+at+12.43.14.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5394275637078833186" /&gt;&lt;/a&gt;&lt;br /&gt;输入 svn update 后可再输入svm info察看结果&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-6512767881853102941?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/6512767881853102941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/10/svnxcode.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/6512767881853102941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/6512767881853102941'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/10/svnxcode.html' title='如何在使用命令行更新SVN下项目里面的部分内容(Xcode)'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_fAv06gZ6FPU/StxQqMaOnRI/AAAAAAAAAEU/mtJH7Xnkgq8/s72-c/Screen+shot+2009-10-19+at+12.42.18.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-4999530085692278175</id><published>2009-10-18T14:14:00.000-07:00</published><updated>2009-10-18T14:43:15.473-07:00</updated><title type='text'>Stanford CS193P - Assigenment1B - WhatATool</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fAv06gZ6FPU/StuJYotEQ5I/AAAAAAAAAEM/_QwThcuQ3eo/s1600-h/Assignment2A.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 118px;" src="http://4.bp.blogspot.com/_fAv06gZ6FPU/StuJYotEQ5I/AAAAAAAAAEM/_QwThcuQ3eo/s320/Assignment2A.png" alt="" id="BLOGGER_PHOTO_ID_5394056035042608018" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;这里就不具体介绍就说了。。直接上代码吧&lt;br /&gt;&lt;br /&gt;WhatATool.m 代码&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#import&lt;br /&gt;#import "PolygonShape.h"&lt;br /&gt;&lt;br /&gt;//sample function for one section, us a similar function per section&lt;br /&gt;//返回用户路径&lt;br /&gt;void printPathInfo()&lt;br /&gt;{&lt;br /&gt;NSString *path = @"~";&lt;br /&gt;path = [path stringByExpandingTildeInPath];&lt;br /&gt;NSArray *pathComponents = [path pathComponents];&lt;br /&gt;NSLog(@"My home folder is at '%@'",path);&lt;br /&gt;NSLog(@"%@",pathComponents);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//返回本程序进程名与ID&lt;br /&gt;void PrintProcessInfo()&lt;br /&gt;{&lt;br /&gt;NSString *processName = [[NSProcessInfo processInfo] processName];&lt;br /&gt;int  processIdentifier = [[NSProcessInfo processInfo] processIdentifier];&lt;br /&gt;NSLog(@"Process Name: '%@' Process ID: '%d'",processName,processIdentifier);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//书签&amp;amp;&amp;amp;字典&lt;br /&gt;void PrintBookmarkInfo()&lt;br /&gt;{&lt;br /&gt;NSArray *keys = [NSArray arrayWithObjects:@"Stanford University", @"Apple", @"CS193P",@"Stanford on iTunes U", @"Stanford Mail", nil];&lt;br /&gt;NSArray *objects = [NSArray arrayWithObjects:@"http://www.stanford.edu", @"http://www.apple.com", @"http://cs193p.stanford.edu", @"http://itunes.stanford.edu", @"http://stanfordshop.com", nil];&lt;br /&gt;NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:objects forKeys:keys];&lt;br /&gt;int length = [dictionary count];&lt;br /&gt;//NSLog(@"%d",length);&lt;br /&gt;/*&lt;br /&gt;for (id key in dictionary)&lt;br /&gt;{&lt;br /&gt;NSLog(@"Key: %@, URL: %@", key, [dictionary objectForKey:key]);&lt;br /&gt;}*/&lt;br /&gt;for(int i=0;i&lt;br /&gt;{&lt;br /&gt;NSString *aString =@"Stanford";&lt;br /&gt;id buffer = [[dictionary allKeys]objectAtIndex:i];&lt;br /&gt;if([buffer hasPrefix:aString])&lt;br /&gt;NSLog(@"Key: %@, URL %@", buffer,[dictionary objectForKey:buffer]);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//Class 识别（数组应用）&lt;br /&gt;void PrintIntrospectionInfo()&lt;br /&gt;{&lt;br /&gt;NSMutableArray *array = [[NSMutableArray alloc]init];&lt;br /&gt;NSString *obj1 = @"Iphone Beginner";&lt;br /&gt;NSURL *obj2 = [[NSURL alloc]initWithString:@"www.apple.com" ];&lt;br /&gt;NSProcessInfo *obj3 = [NSProcessInfo processInfo];&lt;br /&gt;&lt;br /&gt;[array addObject:obj1];&lt;br /&gt;[array addObject:obj2];&lt;br /&gt;[array addObject:obj3];&lt;br /&gt;int count = [array count];&lt;br /&gt;for(int i=0;i&lt;br /&gt;{&lt;br /&gt;id obj = [array objectAtIndex:i];&lt;br /&gt;NSLog(@"Class Name: %@",[obj className]);&lt;br /&gt;if([obj isMemberOfClass:[NSString class]])&lt;br /&gt;NSLog(@"Is Member of NSString: YES");&lt;br /&gt;else&lt;br /&gt;NSLog(@"Is Member of NSString: NO");&lt;br /&gt;if([obj isKindOfClass:[NSString class]])&lt;br /&gt;NSLog(@"IS Kind of NSString: YES");&lt;br /&gt;else&lt;br /&gt;NSLog(@"Is Kind of NSString: NO");&lt;br /&gt;if([obj respondsToSelector:@selector(lowercaseString)])&lt;br /&gt;{&lt;br /&gt;NSLog(@"Responds to lowercaseString: YES");&lt;br /&gt;NSLog(@"lowercaseString is: %@",[obj performSelector:@selector(lowercaseString)]);&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;NSLog(@"Responds to lowercaseString: NO");&lt;br /&gt;&lt;br /&gt;NSLog(@"================================================");&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//多边形&lt;br /&gt;void PrintPolygonInfo()&lt;br /&gt;{&lt;br /&gt;PolygonShape *square = [[PolygonShape alloc]init];&lt;br /&gt;[square initWithNumberOfSides:4 minimumNumberOfSides:3 maximumNumberOfSides:7];&lt;br /&gt;PolygonShape *hexagon = [[PolygonShape alloc]initWithNumberOfSides:6 minimumNumberOfSides:5 maximumNumberOfSides:9];&lt;br /&gt;PolygonShape *dodecagon = [[PolygonShape alloc]initWithNumberOfSides:12 minimumNumberOfSides:9 maximumNumberOfSides:12];&lt;br /&gt;&lt;br /&gt;NSLog(@"%@",[square description]);&lt;br /&gt;NSLog(@"%@",[hexagon description]);&lt;br /&gt;NSLog(@"%@",[dodecagon description]);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main (int argc, const char * argv[]) {&lt;br /&gt;NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];&lt;br /&gt;&lt;br /&gt;printPathInfo();           //Section1&lt;br /&gt;PrintProcessInfo();        //Section2&lt;br /&gt;PrintBookmarkInfo();       //Section3&lt;br /&gt;PrintIntrospectionInfo();  //Section4&lt;br /&gt;&lt;br /&gt;PrintPolygonInfo();        //Section6&lt;br /&gt;//NSLog(@"Hello world");&lt;br /&gt;[pool drain];&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;foundation h=""&gt;&lt;length;i++)&gt;&lt;count;i++)&gt;&lt;br /&gt;&lt;/count;i++)&gt;&lt;/length;i++)&gt;&lt;/foundation&gt;&lt;br /&gt;&lt;br /&gt;PolygonShape.h 代码&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;//&lt;br /&gt;//  PolygonShape.h&lt;br /&gt;//  WhatATool&lt;br /&gt;//&lt;br /&gt;//  Created by Nono on 29/12/2008.&lt;br /&gt;//  Copyright 2008 user. All rights reserved.&lt;br /&gt;//&lt;br /&gt;&lt;br /&gt;#import &lt;Foundation/Foundation.h&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;@interface PolygonShape : NSObject &lt;br /&gt;{&lt;br /&gt; int numberOfSides;&lt;br /&gt; int minimumNumberOfSides;&lt;br /&gt; int maximumNumberOfSides;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@property int numberOfSides;&lt;br /&gt;@property int minimumNumberOfSides;&lt;br /&gt;@property int maximumNumberOfSides;&lt;br /&gt;@property (readonly) float angleInDegrees;&lt;br /&gt;@property (readonly) float angleInRadians;&lt;br /&gt;@property (readonly) NSString *name;&lt;br /&gt;&lt;br /&gt;-(id)initWithNumberOfSides:(int)sides minimumNumberOfSides:(int)min maximumNumberOfSides:(int)max;&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;PolygonShape.m 代码&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;//&lt;br /&gt;//  PolygonShape.m&lt;br /&gt;//  WhatATool&lt;br /&gt;//&lt;br /&gt;//  Created by Nono on 29/12/2008.&lt;br /&gt;//  Copyright 2008 user. All rights reserved.&lt;br /&gt;//&lt;br /&gt;&lt;br /&gt;#import "PolygonShape.h"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;@implementation PolygonShape&lt;br /&gt;&lt;br /&gt;@synthesize numberOfSides;&lt;br /&gt;@synthesize minimumNumberOfSides;&lt;br /&gt;@synthesize maximumNumberOfSides;&lt;br /&gt;&lt;br /&gt;-(id)init&lt;br /&gt;{&lt;br /&gt; [self initWithNumberOfSides:5 minimumNumberOfSides:3 maximumNumberOfSides:10];&lt;br /&gt; return self;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-(id)initWithNumberOfSides:(int)sides minimumNumberOfSides:(int)min maximumNumberOfSides:(int)max&lt;br /&gt;{&lt;br /&gt; self = [super init];&lt;br /&gt; [self setMinimumNumberOfSides:min];&lt;br /&gt; [self setMaximumNumberOfSides:max];&lt;br /&gt; [self setNumberOfSides:sides];&lt;br /&gt; &lt;br /&gt; NSLog(@"The Minimum of sides is: %d, The Maximum of sides is: %d, The sides of the Polygon is: %d",min,max,sides);&lt;br /&gt; return self;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-(void) setMinimumNumberOfSides: (int)min&lt;br /&gt;{&lt;br /&gt; if(min&lt;2)&lt;br /&gt; {&lt;br /&gt;  NSLog(@"Invalid number of minimumNumberOfSides: %d is less than 2",min);&lt;br /&gt; }&lt;br /&gt; else &lt;br /&gt; {&lt;br /&gt;  minimumNumberOfSides = min;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-(void) setMaximumNumberOfSides: (int)max&lt;br /&gt;{&lt;br /&gt; if(max&gt;12)&lt;br /&gt; {&lt;br /&gt;  NSLog(@"Invalid number of maximunberOfSides: %d is greater than 12",max);&lt;br /&gt; }&lt;br /&gt; else &lt;br /&gt; {&lt;br /&gt;  maximumNumberOfSides = max;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-(void) setNumberOfSides: (int)sides&lt;br /&gt;{&lt;br /&gt; if(sides&lt;minimumNumberOfSides)&lt;br /&gt; {&lt;br /&gt;  NSLog(@"Invalid number of sides: %d is less than the minimum of %d allowed",sides,minimumNumberOfSides);&lt;br /&gt; }&lt;br /&gt; else if(sides&gt;maximumNumberOfSides)&lt;br /&gt; {&lt;br /&gt;  NSLog(@"Invalid number of sides: %d is greater than the maxinmum of %d allowed",sides,maximumNumberOfSides);&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt;  numberOfSides = sides;&lt;br /&gt;  NSLog(@"Number of sides: %d",sides);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-(float) angleInDegrees&lt;br /&gt;{&lt;br /&gt; float angleInDegrees = (180*(numberOfSides-2)/numberOfSides);&lt;br /&gt; return angleInDegrees;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-(float) angleInRadians&lt;br /&gt;{&lt;br /&gt; float Pi = 3.141592;&lt;br /&gt; float angleInRadians = [self angleInDegrees]/180*Pi;&lt;br /&gt; return angleInRadians;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-(NSString *)name &lt;br /&gt;{&lt;br /&gt; NSString *nameArray[] = {nil,@"Henagon", @"Digon", @"Triangle",@"Square", @"Pentagon", @"Hexagon",&lt;br /&gt; @"Heptagon",@"Octagon",@"Enneagon",@"Decagon",@"Hendecagon",@"Dodecagon",nil};&lt;br /&gt;    return nameArray[numberOfSides]; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-(NSString *)description&lt;br /&gt;{&lt;br /&gt; return [NSString stringWithFormat:@"Hello I am a %d-sides polygon ('%@') with angles of %f degrees (%f radians).",[self numberOfSides],[self name],[self angleInDegrees],[self angleInRadians]];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-4999530085692278175?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/4999530085692278175/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/10/stanford-cs193p-assigenment2-whatatool.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/4999530085692278175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/4999530085692278175'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/10/stanford-cs193p-assigenment2-whatatool.html' title='Stanford CS193P - Assigenment1B - WhatATool'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_fAv06gZ6FPU/StuJYotEQ5I/AAAAAAAAAEM/_QwThcuQ3eo/s72-c/Assignment2A.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-8102710556327195823</id><published>2009-10-18T12:46:00.001-07:00</published><updated>2009-10-18T14:43:27.997-07:00</updated><title type='text'>Stanford CS193P - Assigenment1A - Hello Stanford</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fAv06gZ6FPU/Stt2r0ZkZCI/AAAAAAAAAEE/jUWZNz2mL_Q/s1600-h/Screen+shot+2009-10-18+at+21.11.46.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 248px;" src="http://1.bp.blogspot.com/_fAv06gZ6FPU/Stt2r0ZkZCI/AAAAAAAAAEE/jUWZNz2mL_Q/s320/Screen+shot+2009-10-18+at+21.11.46.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5394035473878639650" /&gt;&lt;/a&gt;&lt;br /&gt;1.打开Xcode新建一个项目，这里命名HelloCocoaChina&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fAv06gZ6FPU/Stts6DGcenI/AAAAAAAAAC0/PWgkmqkTBrM/s1600-h/Screen+shot+2009-10-18+at+20.28.12.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 236px;" src="http://2.bp.blogspot.com/_fAv06gZ6FPU/Stts6DGcenI/AAAAAAAAAC0/PWgkmqkTBrM/s320/Screen+shot+2009-10-18+at+20.28.12.png" alt="" id="BLOGGER_PHOTO_ID_5394024723226851954" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fAv06gZ6FPU/Stts22He2xI/AAAAAAAAACs/UPMUa7eAzso/s1600-h/Screen+shot+2009-10-18+at+20.27.43.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 208px;" src="http://3.bp.blogspot.com/_fAv06gZ6FPU/Stts22He2xI/AAAAAAAAACs/UPMUa7eAzso/s320/Screen+shot+2009-10-18+at+20.27.43.png" alt="" id="BLOGGER_PHOTO_ID_5394024668201933586" border="0"&gt;&lt;/a&gt;&lt;br /&gt;2.点击工具栏左边的NIB Files 双击 MainWindow.xib&lt;br /&gt;shift + cmd + L 开打Libary 界面&lt;br /&gt;cmd ＋ 1 打开属性界面&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fAv06gZ6FPU/SttyBgzUUMI/AAAAAAAAADU/qkALOmt6BI4/s1600-h/Screen+shot+2009-10-18+at+20.33.54.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 221px;" src="http://4.bp.blogspot.com/_fAv06gZ6FPU/SttyBgzUUMI/AAAAAAAAADU/qkALOmt6BI4/s320/Screen+shot+2009-10-18+at+20.33.54.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5394030349016912066" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fAv06gZ6FPU/SttyEpb7dfI/AAAAAAAAADc/pDzr2XwMsDQ/s1600-h/Screen+shot+2009-10-18+at+20.37.42.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 182px;" src="http://3.bp.blogspot.com/_fAv06gZ6FPU/SttyEpb7dfI/AAAAAAAAADc/pDzr2XwMsDQ/s320/Screen+shot+2009-10-18+at+20.37.42.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5394030402874340850" /&gt;&lt;/a&gt;&lt;br /&gt;3.在Libary工具栏里面选取一个Label放置在Window中间，在属性的Text选项中设置内容为Hello CocoaChina&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fAv06gZ6FPU/SttyvWhtySI/AAAAAAAAADk/RC7GcongcQs/s1600-h/Screen+shot+2009-10-18+at+20.55.21.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_fAv06gZ6FPU/SttyvWhtySI/AAAAAAAAADk/RC7GcongcQs/s320/Screen+shot+2009-10-18+at+20.55.21.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5394031136532711714" /&gt;&lt;/a&gt;&lt;br /&gt;4.把CocoaChina.png这个图片拖入到工程的resource栏中&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fAv06gZ6FPU/Stt0zl1AQ7I/AAAAAAAAAD0/vvhjpU0PUts/s1600-h/Screen+shot+2009-10-18+at+21.02.37.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 145px;" src="http://4.bp.blogspot.com/_fAv06gZ6FPU/Stt0zl1AQ7I/AAAAAAAAAD0/vvhjpU0PUts/s320/Screen+shot+2009-10-18+at+21.02.37.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5394033408382878642" /&gt;&lt;/a&gt;&lt;br /&gt;5.在libary工具栏中选取一个ImageView放置在window中间，在属性的Image属性中选择CocoaChina.png&lt;br /&gt;  在属性中选择Scale to fill&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fAv06gZ6FPU/Stt2F8IEdII/AAAAAAAAAD8/pK6S97iG8tE/s1600-h/Screen+shot+2009-10-18+at+21.08.02.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 180px;" src="http://1.bp.blogspot.com/_fAv06gZ6FPU/Stt2F8IEdII/AAAAAAAAAD8/pK6S97iG8tE/s320/Screen+shot+2009-10-18+at+21.08.02.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5394034823117698178" /&gt;&lt;/a&gt;&lt;br /&gt;6.点击运行按钮&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fAv06gZ6FPU/Stt2r0ZkZCI/AAAAAAAAAEE/jUWZNz2mL_Q/s1600-h/Screen+shot+2009-10-18+at+21.11.46.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 248px;" src="http://1.bp.blogspot.com/_fAv06gZ6FPU/Stt2r0ZkZCI/AAAAAAAAAEE/jUWZNz2mL_Q/s320/Screen+shot+2009-10-18+at+21.11.46.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5394035473878639650" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-8102710556327195823?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/8102710556327195823/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/10/stanford-cs193p-assigenment1-hello_18.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/8102710556327195823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/8102710556327195823'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/10/stanford-cs193p-assigenment1-hello_18.html' title='Stanford CS193P - Assigenment1A - Hello Stanford'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_fAv06gZ6FPU/Stt2r0ZkZCI/AAAAAAAAAEE/jUWZNz2mL_Q/s72-c/Screen+shot+2009-10-18+at+21.11.46.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-761938281462748751</id><published>2009-10-18T12:14:00.000-07:00</published><updated>2009-10-18T12:20:12.008-07:00</updated><title type='text'>开始写Stanfordiphone教程的习题部分</title><content type='html'>答应了Simonli大哥参与这个Stanford大学iPhone教程中文版本整理和推广的工作。&lt;br /&gt;的确让人兴奋，一个很有意义的工作！！！&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;招募热心网友一起翻译CS193P了，以文会友&lt;br /&gt;&lt;br /&gt;    管理提醒： 本帖被 nono 执行置顶操作(2009-10-13)&lt;br /&gt;&lt;br /&gt;CS193P中文字幕自发表以来，得到广大网友的积极响应。很多网友鼓励我把这项很有意义的工作坚持下去，但是本人俗事缠身，深感力有未逮，这里特招募热心的网友们，奉献您的才智，和我一起完成这项工作。&lt;br /&gt;加入这项计划，首先需要您的无私奉献。您需要付出巨大的精力，失去一些陪伴家人和朋友的时间，在计划时间内完成听辨，翻译工作。&lt;br /&gt;加入这项计划，你可以巩固自己对iPhone开发的理解，系统地整理自己知识，你把自己的知识和技能告诉了其他人，会得到他们的反馈，投之以桃，报之以李，从而促进你更深的理解iPhone开发。&lt;br /&gt;加入这项计划，毫无疑问您会交到很多的朋友。和你一起翻译的战友会欣赏您的才华，无数的观众甚至可能成为您的粉丝。您的人际网络由此而扩展，单身的您甚至有可能收获自己的另一半。      &lt;br /&gt;另外说一句，本计划已经得到Apple工程师的大力支持。本人给Standford大学发了邮件，Alan Cannistraro，CS193P的主讲之一，回信说他们正考虑怎样把字幕加入到课程中，让更多的人从中受益。&lt;br /&gt;有兴趣的，请和我联系。&lt;br /&gt;&lt;br /&gt;其实完成这个工作不仅是需要听力好的人，还有很多其他事情要做。我简单地把翻译的流程总结为：&lt;br /&gt;1）听力。把视频中的英文整理出来&lt;br /&gt;2）时间轴矫正。就是为字幕加上时间信息，使它和视频同步。这个可以和1）合并&lt;br /&gt;3）把英文字幕翻译成中文&lt;br /&gt;4）审核，校对&lt;br /&gt;如果有人都上述任何一项有兴趣，都欢迎加入。&lt;br /&gt;&lt;br /&gt;感谢Nono帮我把帖子置顶，而且他答应帮我们整理教程作业。非常热心的同学。&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-761938281462748751?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/761938281462748751/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/10/stanfordiphone.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/761938281462748751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/761938281462748751'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/10/stanfordiphone.html' title='开始写Stanfordiphone教程的习题部分'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-319375291399004759</id><published>2009-10-16T03:16:00.000-07:00</published><updated>2009-10-16T03:41:29.627-07:00</updated><title type='text'>关于开源的iphone 程序下载途径</title><content type='html'>&lt;ul&gt;&lt;li&gt;首先肯定是顶自己的板块咯：&lt;/li&gt;&lt;/ul&gt;CocoaChina代码例子区&lt;br /&gt;http://www.cocoachina.com/bbs/thread.php?fid-19.html&lt;br /&gt;http://www.cocoachina.com/downloads/index.html&lt;br /&gt;http://www.cocoachina.com/bbs/thread.php?fid-8.html&lt;br /&gt;&lt;br /&gt;http://www.gourmetapps.com/&lt;br /&gt;http://www.iphone.org.hk/cgi-bin/ch/topic_show.cgi?id=9312&amp;amp;bpg=1&amp;amp;age=0&lt;br /&gt;http://osliving.com/sourced/open-source/open-source-iphone-applications/&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;最好的当然是通过以下两个途径&lt;/li&gt;&lt;/ul&gt;1.在http://github.com/   &lt;br /&gt;2.http://code.google.com/&lt;br /&gt;&lt;br /&gt;关键字iphone，erica&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fAv06gZ6FPU/SthJ8X0wCTI/AAAAAAAAACU/7H0aVFzGiCk/s1600-h/UCC%E6%AF%95%E4%B8%9A%E5%85%B8%E7%A4%BC+076.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_fAv06gZ6FPU/SthJ8X0wCTI/AAAAAAAAACU/7H0aVFzGiCk/s320/UCC%E6%AF%95%E4%B8%9A%E5%85%B8%E7%A4%BC+076.jpg" alt="" id="BLOGGER_PHOTO_ID_5393141855312415026" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-319375291399004759?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/319375291399004759/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/10/iphone.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/319375291399004759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/319375291399004759'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/10/iphone.html' title='关于开源的iphone 程序下载途径'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_fAv06gZ6FPU/SthJ8X0wCTI/AAAAAAAAACU/7H0aVFzGiCk/s72-c/UCC%E6%AF%95%E4%B8%9A%E5%85%B8%E7%A4%BC+076.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-3978662482456279875</id><published>2009-10-15T04:42:00.000-07:00</published><updated>2009-10-25T08:01:38.613-07:00</updated><title type='text'>LoadingView－iPhone (登陆等待界面—网络互动)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fAv06gZ6FPU/SuRoSdp3cvI/AAAAAAAAAFM/VOxMsX8LpCA/s1600-h/Screen+shot+2009-10-25+at+15.00.59.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 255px; height: 253px;" src="http://3.bp.blogspot.com/_fAv06gZ6FPU/SuRoSdp3cvI/AAAAAAAAAFM/VOxMsX8LpCA/s320/Screen+shot+2009-10-25+at+15.00.59.png" alt="" id="BLOGGER_PHOTO_ID_5396552919903859442" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;在程序进行数据处理和交互的时候常常会出现需要等待的情况，这个时候经常得处理方法就是做一个等待界面，俗称Loading View。&lt;br /&gt;&lt;br /&gt;一来防止数据处理过程中用户的错误操作。&lt;br /&gt;二来可以减轻用户等待过程中烦躁的情绪。&lt;br /&gt;&lt;br /&gt;在view即将出现之前完成数据的&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;- (void)viewWillAppear:(BOOL)animated {&lt;br /&gt; [super viewWillAppear:animated];&lt;br /&gt; // Your view is about to move onscreen&lt;br /&gt; [self beginLoadingDataFromTheWeb];&lt;br /&gt; [self startShowingLoadingProgress];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (void)viewWillDisappear:(BOOL)animated {&lt;br /&gt; [super viewWillDisappear:animated];&lt;br /&gt; // Your view is about to move offscreen&lt;br /&gt; [self saveDataToDisk];&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;iPhone通过GPRS或者3G网络与web－server进行数据交互。&lt;br /&gt;受到显示网络情况的影响常常有数秒钟的延迟。。。所以Loading View 是经常用到的。。。&lt;br /&gt;&lt;br /&gt;在操作需要数据交互，可能导致用户等待的操作同事。初始化Loading View&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;LoadingViewController *lvc = [[LoadingViewController alloc]&lt;br /&gt;                                                             initWithTitle:self.title Description:@"Registering User"];&lt;br /&gt;&lt;br /&gt;UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:lvc];&lt;br /&gt;&lt;br /&gt;nc.navigationBar.barStyle = UIBarStyleBlackOpaque;&lt;br /&gt;&lt;br /&gt;[self.navigationController presentModalViewController:nc animated:NO];&lt;br /&gt;&lt;br /&gt;[lvc release];&lt;br /&gt;[nc release];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;这里的技巧就是用到了 presentModalViewController&lt;br /&gt;这个技巧就方便在适当的时候 移除 Loading View&lt;br /&gt;&lt;br /&gt;根据iPhone SDK自带的API 对网络状态的回馈数据信息进行检测。。。&lt;br /&gt;如果回馈的信息准确无误可以进行下后续操作，即Remove掉之前的Loading－View&lt;br /&gt;用到的方法是 [self dismissModalViewControllerAnimated:NO];&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-3978662482456279875?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/3978662482456279875/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/10/loadingviewiphone.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/3978662482456279875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/3978662482456279875'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/10/loadingviewiphone.html' title='LoadingView－iPhone (登陆等待界面—网络互动)'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_fAv06gZ6FPU/SuRoSdp3cvI/AAAAAAAAAFM/VOxMsX8LpCA/s72-c/Screen+shot+2009-10-25+at+15.00.59.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-1631163433407237203</id><published>2009-06-18T08:15:00.000-07:00</published><updated>2009-06-18T08:26:34.966-07:00</updated><title type='text'>关于 &amp; 操作符 的一种用法</title><content type='html'>在 C ，C++ 和OBJ－C 中 &amp;amp;的用法有很多种&lt;br /&gt;&lt;br /&gt;这里介绍一种很好用的方法：&lt;br /&gt;在判断A 是否是 B 的整数倍时很好用&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fAv06gZ6FPU/SjpbU9wj8QI/AAAAAAAAAAk/6_U0E8hFj34/s1600-h/Picture+4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 259px;" src="http://3.bp.blogspot.com/_fAv06gZ6FPU/SjpbU9wj8QI/AAAAAAAAAAk/6_U0E8hFj34/s400/Picture+4.png" alt="" id="BLOGGER_PHOTO_ID_5348687923189641474" border="0" /&gt;&lt;/a&gt;这里一旦 Count 是 8 的倍数 就会返回0，其他的时候返回余数！&lt;br /&gt;具体原理还是让我们回到16进制&lt;br /&gt;0其实是 OX   000&lt;br /&gt;8其实是 OX   100&lt;br /&gt;16是        OX 1100&lt;br /&gt;其实就是比较后面三位是否相同，相同的话就return 0;&lt;br /&gt;细心一想就会明白 8 倍数 的后3倍必定是 OX 100&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-1631163433407237203?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/1631163433407237203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/06/blog-post_18.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/1631163433407237203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/1631163433407237203'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/06/blog-post_18.html' title='关于 &amp; 操作符 的一种用法'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_fAv06gZ6FPU/SjpbU9wj8QI/AAAAAAAAAAk/6_U0E8hFj34/s72-c/Picture+4.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-9147290463093578353</id><published>2009-06-08T03:49:00.001-07:00</published><updated>2009-10-16T02:36:28.290-07:00</updated><title type='text'>(iPhone)－UIStatusBar</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fAv06gZ6FPU/Siztblu7ruI/AAAAAAAAAAU/64qyPo2a8_4/s1600-h/Picture+6.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 67px;" src="http://4.bp.blogspot.com/_fAv06gZ6FPU/Siztblu7ruI/AAAAAAAAAAU/64qyPo2a8_4/s400/Picture+6.png" alt="" id="BLOGGER_PHOTO_ID_5344907916023148258" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;如何隐UIStatusBar，全屏问题！！&lt;br /&gt;&lt;br /&gt;在info.plist 里，要自行加上一個：UIStatusBarHidden！&lt;br /&gt;&lt;br /&gt;如何设置UIStatusBar的风格：&lt;br /&gt;&lt;br /&gt;[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyle;&lt;br /&gt;&lt;br /&gt;typedef enum {&lt;br /&gt;UIStatusBarStyleDefault,&lt;br /&gt;UIStatusBarStyleBlackTranslucent,&lt;br /&gt;UIStatusBarStyleBlackOpaque&lt;br /&gt;} UIStatusBarStyle;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fAv06gZ6FPU/Stg-GIYp3dI/AAAAAAAAAB8/Qk2hfjFUCDU/s1600-h/Screen+shot+2009-10-16+at+10.30.32.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 321px; height: 20px;" src="http://4.bp.blogspot.com/_fAv06gZ6FPU/Stg-GIYp3dI/AAAAAAAAAB8/Qk2hfjFUCDU/s400/Screen+shot+2009-10-16+at+10.30.32.png" alt="" id="BLOGGER_PHOTO_ID_5393128828827196882" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fAv06gZ6FPU/Stg-UYsQfOI/AAAAAAAAACE/mrP_RJAxqtQ/s1600-h/Screen+shot+2009-10-16+at+10.30.51.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 324px; height: 20px;" src="http://4.bp.blogspot.com/_fAv06gZ6FPU/Stg-UYsQfOI/AAAAAAAAACE/mrP_RJAxqtQ/s400/Screen+shot+2009-10-16+at+10.30.51.png" alt="" id="BLOGGER_PHOTO_ID_5393129073722555618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fAv06gZ6FPU/Stg-cyD7b7I/AAAAAAAAACM/DhMnWZglNS0/s1600-h/Screen+shot+2009-10-16+at+10.30.09.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 324px; height: 20px;" src="http://1.bp.blogspot.com/_fAv06gZ6FPU/Stg-cyD7b7I/AAAAAAAAACM/DhMnWZglNS0/s400/Screen+shot+2009-10-16+at+10.30.09.png" alt="" id="BLOGGER_PHOTO_ID_5393129217971679154" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-9147290463093578353?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/9147290463093578353/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/06/iphoneinfoplist-uistatusbarhidden.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/9147290463093578353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/9147290463093578353'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/06/iphoneinfoplist-uistatusbarhidden.html' title='(iPhone)－UIStatusBar'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_fAv06gZ6FPU/Siztblu7ruI/AAAAAAAAAAU/64qyPo2a8_4/s72-c/Picture+6.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4102114367534237129.post-2380731334978713426</id><published>2009-06-07T06:04:00.001-07:00</published><updated>2009-06-07T06:14:26.738-07:00</updated><title type='text'>第一周的最后一天</title><content type='html'>记得前天下午准备做一个work－scheme.打开iPhone 一看居然星期5了。一点点惊讶plus一点点的失落。不知不觉居然周五了，马上第一周就这样结束了。耳边隐约回响起yiqing师兄的话“再熬个3天就到周末了，就可以放假了”。。。。仿佛这句话是他刚刚说的。。。。哎！莫非上帝无端端偷走了我三天的光阴，哎！貌似什么也没做这周，不过忙忙碌碌的，感觉特别充实！时间真的不够用，可是和朋友褒电话粥，以及和室友聊天的时间貌似又难以割舍！哎！天天都觉得心有余而力不足！！&lt;br /&gt;心的环境大家都对我很好，尤其是师兄和嫂子！&lt;br /&gt;Biggest supperise 是我的老板！被他剥削了两天我就成了他的“粉丝”！！甚至打消了回国的念头。。哎！！！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4102114367534237129-2380731334978713426?l=nono123idea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nono123idea.blogspot.com/feeds/2380731334978713426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://nono123idea.blogspot.com/2009/06/blog-post_07.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/2380731334978713426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4102114367534237129/posts/default/2380731334978713426'/><link rel='alternate' type='text/html' href='http://nono123idea.blogspot.com/2009/06/blog-post_07.html' title='第一周的最后一天'/><author><name>nono123</name><uri>http://www.blogger.com/profile/16760788728581048909</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
