網頁

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的文字顶部对

2013年7月22日 星期一

iOS開發筆記 - NSDictionary key sort

NSDictionary如同hash table,它的key是沒排序過,查了下,其實可以用變通方式

Step 1: 先將Key排序做成一個array
NSArray * sortedKeys = [[keys allKeys] sortedArrayUsingSelector: @selector(caseInsensitiveCompare:)];

Step 2: 使用時用做出來的array來遞迴取出
for( Object *ob in sortedKeys ) {
    //你想做的事
}


這樣就是排好的了

參考網址:
sort NSDictionary values by key alphabetical order

2013年7月19日 星期五

CentOS筆記-安裝GIT

CentOS 5:
>yum install git

發現沒有GIT,只好自行下載,大概步驟如下:
>wget https://git-core.googlecode.com/files/git-1.7.11.1.tar.gz
>tar zxvf git-1.7.11.1.tar.gz
>cd git-1.7.11.1
>yum install zlib-devel openssl-devel cpio expat-devel gettext-devel
>./configure
>make
>make install


測試一下能不能用,打入
>git --verion

可以看到GIT的版本,不過我實際使用是從網路上取得,打上git clone https://xxx.com/xxx/new.git
卻出現:fatal: Unable to find remote helper for 'https'

查了下發現可能是curl的問題,所以GIT要再compile進curl,指令如下:
>yum install curl*
>cd git-1.7.11.1
>./configure
>make


再輸入git clone https://xxx.com/xxx/new.git,發現可以取得code了

CentOS 6:yum上面有git可用
>yum install git


參考網址:
Centos 5.8 install your own git server
repo下载android出现fatal: Unable to find remote helper for 'https'问题的方法
git clone: fatal: Unable to find remote helper for 'https'

2013年7月13日 星期六

CentOS筆記-PHP Fatal error: Call to undefined function mb_detect_encoding()

安裝phpmyadmin時,發現有底下的error

PHP Fatal error:  Call to undefined function mb_detect_encoding() in /var/www/html/mysqladmin/libraries/php-gettext/gettext.inc on line 177

猜測是少了某個套件,一查下果然,是少了mbstring

使用底下指令安裝php這套件後,就好了
> yum install php-mbstring

參考網址:
Simple HTML Dom - Fatal error when using load_file

2013年7月4日 星期四

CentOS筆記-設定https

Step1. 確定有Apache server

Step 2. 確定有openssl,沒有的話執行
yum install openssl
(記得用/sbin/service httpd configtest檢查)

Step 3. 確定有安裝mod_ssl,沒有的話執行
yum install mod_ssl

Step 4. 產生認證
1. cd /etc/pki/tls/private
2. 產生2048的key: openssl genrsa -out private.key 2048
3. 產生憑證檔請求檔: openssl req -new -key private.key -out https.csr
4. 自行產生x509憑證檔:open x509 -req -days 365 -in https.csr -signkey private key -out server.crt
(正常下是要請CA用憑證檔請求檔來產生x509憑證檔,要花錢)

這樣這兩個檔都放在/etc/pki/tls/private(可以自行放在想要的位置)

Step 5. 編輯ssl.conf,找到
SSLCertificateFile /etc/pki/tls/private/server.crt
SSLCertificateKeyFile /etc/pki/tls/private/private.key

Step 6. 檢查設定及重啟
/sbin/service httpd configtest
/sbin/service httpd restart

這樣就行了

參考網址:
Apache 開啟 HTTPS
http://disp.cc/b/11-3UNW
DER vs. CRT vs. CER vs. PEM Certificates and How To Convert Them