網頁

2013年7月28日 星期日

iOS開發筆記 - NSUserDefaults的使用

以前都很辛苦的用sqlite或NSDictionary去紀錄一些使用者的資料,沒想到其實apple已經很貼心的做了一個好用的NSUserDefaults,可以簡單的紀錄一些資訊,說簡單也是能紀錄所有Cocoa上的所有Object(除了自訂的資料型態,要自行處理)。

使用上很容易,如下所示:
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:string forKey:@"Hello world"];
NSArray *array = @[@"123",@"456"];
[userDefaults setObject:array forKey:@"Array"];
BOOL isValid = YES;
[userDefaults setBool: isValid forKey:@"isValid"];
int number = 100;
[userDefaults setInteger:number forKey:@"number"];


要注意的是,設定好後只是單純的cache住,要存進硬碟要用,才真正儲存
[userDefaults synchronize];

取值很容易
[userDefaults stringForKey:@"Hello world"];
[userDefaults arrayForKey:@"Array"];
[userDefaults boolForKey:@"isValid"];
[userDefaults integerForKey:@"number"];


參考網址:
NSUserDefaults (plist) 筆記
返璞归真,忘掉NSUserDefaults
NSUserDefaults Class Reference
NSUserDefaults customize behavior to match a user’s preferences

2013年7月25日 星期四

CentOS筆記-安裝LAMP

前陣子用阿里雲的系統:CentOS 6.3,建好是一整個空的系統,連Apache、MySQL都沒有,真的空空如也,只能自己加上去,這邊記一下步驟:

安裝Apache http server
yum install httpd
service httpd start


修改/etc/httpd/conf/httpd.conf中<Directory "/var/www/html">下的Options
原Options Indexes FollowSymLinks
改成Options -Indexes FollowSymLinks

安裝Mysql Server
yum install mysql-server
service mysqld start
/usr/bin/mysql_secure_installation


若要安裝5.5版,可以看CentOS筆記-CentOS 6.5 安裝MySQL 5.5

最後一個指令可以設定root密碼,將一些用不到的table及權限去除(link: MySQL Server 安裝後的設定)

安裝PHP
yum install php php-mysql php-mysqli php-mbstring

重啟
chkconfig httpd on
chkconfig mysqld on

或
service httpd restart
service mysqld restart

這樣一個基本的LAMP就架起來了

架phpMyAdmin
我習慣用phpMyAdmin,所以再到PhpMyAdmin Home下載最新的tar檔,上傳到/var/www底下解開後,我是都會改目錄名稱為myadmin,用http://{hostname或ip}/myadmin,就可以用了,不過這次卻發生CentOS筆記-PHP Fatal error: Call to undefined function mb_detect_encoding()中提到的問題,就再依文中所提處理即可。

若有要安裝wordpress,是要再注意/etc/httpd/conf/httpd.conf中
LoadModule rewrite_module modules/mod_rewrite.so <-- 這個要有

檔案最後再加上底下幾行(主要是Rewrite那幾行)
AddType application/x-httpd-php .php .phtml

RewriteEngine on
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F]


記得再重啟http server

參考網址:
How to Install Linux, Apache, MySQL, PHP (LAMP) stack on CentOS 6
新安裝 CentOS 6.5 筆記

2013年7月24日 星期三

AdSense-申請 part 4

過了超久,我終於申請到AdSense,經過上次的幾次教訓,這次重新看了下自己AdSense-申請 part 2寫的東西,每次的回應都是
感謝您對 Google AdSense 感興趣。在審查過您的申請之後,我們的專員發現您的申請並不符合我們的計劃條件。因此,我們無法讓您加入我們的計劃。
想了想,重新注意到底下的訊息
重要注意事項:
* 您必須安裝廣告程式碼,我們才能完成審查手續。如果不知道怎麼在 Google 擁有的 API (如 YouTube) 上安裝廣告程式碼,請參考:xxxxx。
* 您的廣告開始出現後,請不要點擊自己的廣告,就算是為了測試也不可以,否則就算違反 AdSense 計劃政策 (https://www.google.com/adsense/policies)。

查了下官網中的建立廣告單元,之前都是直接在加入Blogger中的Adsense元件,會不會其實還是篏入javascript比較實在,當下再重新申請,這次很快就有了初步通過的回應,取得上述的回應後,這次改用“HTML/JavaScript”,大概的動作如是:

Step1: 按下版面配置 > 新增小工具 > HTML/JavaScrip
Step2: 進入AdSense的帳戶中,新增一個廣告單元(這邊有教學:建立廣告單元)
Step3: 點選新建好的廣告單元上的“獲取代碼”,出現javascript,整個copy
Step4: 貼到HTML/JavaScrip的內容中,標題可以不用

這樣就ok了,再來就是等了,偶爾也要記得更新下文章,祝好運....

參考網址:
建立廣告單元
关于 HTML 的简单说明
使用已关联 AdSense 帐户在我自己的网站上展示广告

iOS開發筆記 - NSArray check NSNull

使用AFNetwork中的JSON時,因為JSON傳回來的有時是null值,取到時常是NSNull而不是null值,所以在檢查時不能用null,而要用[NSNull null],但NSArray的object在直接比較時,就會出現NSArray無法和NSNull比較的問題,例如:

NSArray *array = (從JSON取得值,但是是NSNull型態回傳)
if( array != [NSNull null] ) {
  //做要做的事
}


但上述的if是有問題的,所以要改用下述的方式

NSArray *array = (從JSON取得值,但是是NSNull型態回傳)
if( array != (id)[NSNull null] ) {
  //做要做的事
}


有點怪怪的,只能說我個人基礎沒打好,要再多訓練

參考網址:
ios check if nsarray == null

2013年7月23日 星期二

iOS開發筆記 - 另一些讓UILabel的字置頂的做法

最近正好有需要,卻忘了自己有寫iOS開發筆記-如何讓UILabel的字能置中且在頂端,還去找,不過倒是因此找到一篇让UILabel的文字顶部对齐,他的第一個做法跟我的做法類似,但多了方式,這邊做個紀錄好了。

===========================================================
原文的三個方法如下(這邊貼上的程式碼都屬於让UILabel的文字顶部对齐的內容)

方法1:寬高設定,不過我使用上是要在設定numberOfLines=0
CGSize maximumSize = CGSizeMake(300, 9999);
NSString *dateString = @"The date today is January 1st, 1999";
UIFont *dateFont = [UIFont fontWithName:@"Helvetica" size:14];
CGSize dateStringSize = [dateString sizeWithFont:dateFont
    constrainedToSize:maximumSize
    lineBreakMode:self.dateLabel.lineBreakMode];
CGRect dateFrame = CGRectMake(10, 10, 300, dateStringSize.height);
self.dateLabel.frame = dateFrame;


方法2:在最後加\n,\n的個數最好和numberOfLines的數字一樣,例如numberOfLines=2,則最後是"\n\n ",這是實際用的感覺,我也是用這方法
for(int i=0; i<newLinesToPad; i++)
    self.text = [self.text stringByAppendingString:@"\n "];

方法3: catogory方式改動UILabel

// -- file: UILabel+VerticalAlign.h
#pragma mark VerticalAlign
@interface UILabel (VerticalAlign)
- (void)alignTop;
- (void)alignBottom;
@end

// -- file: UILabel+VerticalAlign.m
@implementation UILabel (VerticalAlign)
- (void)alignTop {
    CGSize fontSize = [self.text sizeWithFont:self.font];
    double finalHeight = fontSize.height * self.numberOfLines;
    double finalWidth = self.frame.size.width;    //expected width of label
    CGSize theStringSize = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(finalWidth, finalHeight) lineBreakMode:self.lineBreakMode];
    int newLinesToPad = (finalHeight  - theStringSize.height) / fontSize.height;
    for(int i=0; i<newLinesToPad; i++)
        self.text = [self.text stringByAppendingString:@"\n "];
}

- (void)alignBottom {
    CGSize fontSize = [self.text sizeWithFont:self.font];
    double finalHeight = fontSize.height * self.numberOfLines;
    double finalWidth = self.frame.size.width;    //expected width of label
    CGSize theStringSize = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(finalWidth, finalHeight) lineBreakMode:self.lineBreakMode];
    int newLinesToPad = (finalHeight  - theStringSize.height) / fontSize.height;
    for(int i=0; i<newLinesToPad; i++)
        self.text = [NSString stringWithFormat:@" \n%@",self.text];
}
@end


參考網址:
让UILabel的文字顶部对
齐