網頁

2012年9月26日 星期三

GIT筆記-新建一個repository

$ mkdir /path/to/your/project
$ cd /path/to/your/project
$ git init
$ git remote add origin {server的git repository}//若有server的話,連接到server的repository
$ echo "# This is my README" >> README.md
$ git add README.md
$ git commit -m "First Commit. Adding a README."
$ git push -u origin master

參考自:bitbucket的建置說明

2012年9月24日 星期一

CentOS筆記-postfix服務與php mail()

最近在解決送信的問題,CentOS 6上執行PHP 5.3的mail(),要利用postfix來送信,明明  postfix己經啟動,但仍然是無法送信。說實在我不熟悉mail server的設定,但所有的事情都一樣,有問題就先找log,所以先找找log在何處,搜尋網路上的資料,才知在/var/log/maillog。看到底下這個錯誤:

postfix/sendmail[10710]: fatal: chdir /var/spool/postfix: Permission denied

蠻怪的,怎會是權限問題,再找了找資料,看到這個Posftix Permission denied problem
嗯,我也是要fast solution。

先用getsebool -a | grep httpd_can_sendmail看看目前設定,果然結果是:httpd_can_sendmail --> off

就用setsebool httpd_can_sendmail 1,再/sbin/service postfix restart及/sbin/service httpd restart

就可以發送了。

不過,因為是fast solution,沒考慮到什麼資安問題,預設是off,也許要注意一下有什麼狀況

參考網址:
建置 POSTFIX 伺服器
[請益]postfix之log解析問題
請問postfix怎樣查錯呀?
Posftix Permission denied problem
setsebool指令
SELinux Booleans

2012年9月22日 星期六

CentOS筆記-php執行在正確的使用者下,仍回應permission deny的原因之一

今天真的學到一課了!!!!

明明網站的目錄權限是770,user及group都apache的情況下,無法在此目錄建立任何資料,可以看到不能建立、修改、刪除。

利用echo `whoami`來取得php的執行user,看是不是有錯,但仍是apache,是沒有問題的,雖然如此但設定成777也無法存取,只好猜測是否有多出來的權限設定,先試用了getfacl,也沒問題,最後找到File permissions with no sense (Linux, Apache)這篇,猜測是restorecon的問題,再找到鳥哥-restorecon文中所提到重設 SELinux 安全性本文,執行步驟如下:

Step 1: 將安全性文本都回到預設值
restorecon -Rv {目錄}

Step 2: 將類型改成httpd_sys_content_t
chcon -R -t httpd_sys_content_t {目錄} //-R是目錄下所有目錄都要更動

這樣就可以回復成正常的apache可讀取權限

耗了我3個小時的時間去處理~~~@@"

參考網址:
File permissions with no sense (Linux, Apache)
鳥哥-restorecon

2012年9月21日 星期五

Wordpress開發筆記-程式發送簡訊

有個客戶的老闆聽說有強迫症,希望每次有問題po上來時,都要能馬上知道,為了解決這症頭,就提出用簡訊來解決好了,為此,找了家簡訊公司先登記,我用的是台灣簡訊,主要是朋友介紹他有用過,跟那幾家大廠(例如:中華xx啦)便宜太多了,一千封980的樣子,加上API簡單,就介紹給這位客戶了,先申請帳號->存值,再來就可以發送了(當然我要幫他把功能做上去)。

他的API還蠻簡單易用的,那案子用的是wordpress,就直接使用wp_remote_post來處理即可(範例用的是fopen,也可以用curl來處理),唯一的缺點就是,一次一個手機

$message = '123456';

$phone_lists = Array('09xxxxxx','09xxxxxx');
foreach($phone_lists as $phone_no) {
  $response = wp_remote_post( 'http://api.twsms.com/smsSend.php', array(
    'method' => 'POST',
    'timeout' => 45,
    'redirection' => 5,
    'httpversion' => '1.0',
    'blocking' => true,
    'headers' => array(),
    'body' => array( 'username' => 'test', 'password' => '123456', 'mobile' => $phone_no, 'message' => urlencode($message) ),
    'cookies' => array()
    )
  );
  if( is_wp_error( $response ) ) {
    echo "<div'>簡訊傳送失敗</div>";
  } else {
  if ($response['response']['message'] == 'OK') {
    echo "<div'>簡訊傳送成功</div>";
  }
}

2012年9月19日 星期三

vim筆記

vim在linux系統上是好用到不行的編輯器,功能之強大到我完全不知道他能幹嘛,但他能做非常多的事,太多了,從朋友Beakdoosan's Weblog那邊轉貼過來....


## 移動 ##
1.往右找第一個n開頭的字: fn, 反方向(向左): Fn
2.游標移動到目前畫面的最上方, 中間及最下方,分別是H,M,L
3.上一頁:C-U or C-B, 下一頁:C-D or C-F
4.游標移動到整個文件的n%位置: n%, 列如 50%
5.找到對應的括號: %
6.將游標目前位置移動到整個畫面的中間位置: zz
7.標記目前游標位置: m[a-z], 回到標記位置: '[a-z], [a-z]代表26個標記名稱, 列出所有標記: marks

## 搜尋 ##
1.往下找: / 往上找: ?
2..*[]^%\/?~$ 這些符號有其他意義,若要搜尋這些符號必須用\規避
3.往下找下一個符合項目: n,反方向: N
4.搜尋不分大小寫: set ignorecase, 反之: set noignorecase
5.以目前游標所在的字當key word搜尋: *
6.搜尋斷句符號: 開頭\<, 結尾\>, 例如:\當條件搜尋時,只會找the而不會找到there
7.搜尋支援正規表示式

## 常用操作 ##
1.當利用dd或x刪除時,其實vim會將刪除的資料除存起來,可利用p貼上(p:貼於游標下, P:貼於游標上)
2.複製整行: yy, 複製2個單字: y2w(會包含單字後方的空白, 若不要空白用ye), 從游標複製到最後: y$
3.複製一整行到剪貼簿上(如此可以任意貼上到不同的應用程式): "+yy, 若要複製部份文字要配合 virtual mode使用
4.將剪貼簿的資料貼到vim: "+p
5.取代: r(取代一個字) or R(取代直到你按ESC)
6.置換大小寫: ~ (可結合virtual mode整批修改)
7.向前刪除一個字元: X, 向後刪除一個字元: x
8.從游標處刪除到行尾: d$ or d
9.從游標前刪除到行頭: d^ or d
10.刪除一整行:dd, 向後刪除一個單字:dw, 刪除游標處一整個單字: daw
11.接續下一行: J
12. 全部取代: %s/BEGIN/LEFTCB/g

## 模式的切換 ##
1.在游標處進入insert mode: i
2.在游標下新增一行並進入insert mode: o
3.在游標上新增一行並進入insert mode: O
4.將游標移動到最前面後進入insert mode: I
5.將游標移動到最後面並進入insert mode: A
6.在游標後方進入insert mode: a
7.以字元式進入virtual mode: v, 以行式進入virtual mode: V, 以區塊式virtual mode: C-V

## 檔案復原 ##
在編輯的過程因不明原因當機,可利用 vim -r yourfile.txt來復原尚未儲存的資料
復原後建議儲存到另外的檔案 w yourfile.txt.recovered

## 分頁 ##
開啟分頁: tabnew
關閉分頁: tabc(若當前只有一個分頁時指令會失敗), 關閉第N個分頁: tabc N
切換分頁: gt(下一個) or gT(上一個)



參考網址:
Replace word in VIM
VIM筆記 - 常用操作

CentOS筆記-查詢目錄所用空間

最近需要看下每個網站的使用空間,突然就傻了,啊在linux中怎用,詢問下才知道超簡單

du -sh {目標folder}
du -h --max-depth=N {目標folder} //N是目標folder下幾層要列出

有夠easy,但~還是做下筆記

2012年9月13日 星期四

iOS開發筆記-UITapGestureRecognize避開UIButton的方式

最近有個需求如下:

  1. 一個Root View,上頭一個ImageView及兩個縮圖(UIButton實作),按了縮圖後,ImageView會顯示此縮圖的原圖
  2. 點一下畫面,會出現此圖的說明
嗯~基本上不難,直接針對這個View實作touch event也ok,不過我要的是用UITapGestureRecognize,但這會有個問題,針對Root View去加入UITapGestureRecognize後,連同Button的touch event都被劫走了,那時以為除了一個個都實作成class後再加上touch實作才行,說穿了

我的狀況是“在一個複雜的View之中,想在View上直接觸點一下,就能執行我要的效果,但原本在上頭的Button一樣要正常運作

以下就以這個樣一段需求來實作。

Step 1. 加入UITapGestureRecognize,記得要在class加入UIGestureRecognizerDelegate
- (void)viewDidLoad
{
    [super viewDidLoad];

    //加入單點觸發
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapScreenShot:)];
    [self addGestureRecognizer:tapGesture];
    tapGesture.delegate = self;
}

Step 2. 寫好要要觸發的function,這邊單純印出字串
- (void)singleTapScreenShot:(UITapGestureRecognizer *)gestureRecognizer
{
    NSLog(@"Tap In");
}

Step 3. 加入觸發後,辨別UIGestureRecognizer是否要觸發,在這我是return NO,讓Button的touch能被取得
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
   
    if ([touch.view isKindOfClass:[UIButton class]]) {
        return NO;
    }
    return YES;
}


touch.view這邊可以自行改成要比對的object,這樣就可以很容易的實作出來了

2012年9月12日 星期三

GIT筆記-收集

===================================
2014/08/27 更新
寫給大家的 Git 教學
歡迎光臨 LearnGitBranching!
一个成功的Git分支模型

===================================
最近有點發神經,Version Control改用git,用的非常非常的不習慣(我還是很愛SVN可以隨便的export),不過不知道為什麼,我還是有種大家都在用了,不習慣一下,以後真的變恐龍,這邊先收集一下不錯的網址吧

網址收集:
Git 初學筆記 - 指令操作教學(我常看這人的blog,蠻仔細的)
Git Magic
Using git with Xcode(我有需要用到xCode,還是放了的好)
Git Study
Git Submodule 的常見錯誤(看來有些方法可以讓GIT跟SVN一樣)
Git Tutorial

Tech Talk: Linus Torvalds on git(Linux之父親自加持...)

2012年9月9日 星期日

iOS開發筆記-switch語法在Object-C中的怪問題

最近寫iOS程式用到switch寫法,寫著寫著一直出現fail的問題,如下:


ListXml是我自訂的class,我以為是這個問題,後來改用ios內建的也一樣,找了找網路上的資料,才知道這是本來就有的問題,如下,在前面加個“;”號,就通過了....




參考網址:
Objective-C Tip: Switch Statements

2012年9月8日 星期六

iOS開發筆記 - app內直接播放YouTube影片(3)

上次寫了iOS開發筆記 - app內直接播放YouTube影片(2)後,實際用了一陣子,使用者實在不大可能去抓取嵌入的src,最愛直接抓網址,頂多能去按分享就很不錯,當然還是得教使用者去按分享按鈕取得連結,只是前篇的方式在url上,就要改成以下的寫法。


NSString *embedHTML =@"<html><head>"
    "<meta name = \"viewport\" content = \"initial-scale = 1.0, user-scalable = no, width = device-width\"/></head>"
    "</head>"
    "<body style=\"background:#FFFFF;margin-top:20px;margin-left:0px\">"
    "<div><object width=\"%0.0f\" height=\"%0.0f\">"
    "<param name=\"wmode\" value=\"transparent\"></param>"
    "<embed src=\"%@&f=user_favorites&app=youtube_gdata\""
    "type=\"application/x-shockwave-flash\" wmode=\"transparent\" width=\"%0.0f\" height=\"%0.0f\"></embed>"
    "</object></div></body></html>";

紅字是更改的部分,後續的參數我是沒有刪除,但一樣可以自動執行

2012年9月5日 星期三

iOS開發筆記-解決下載中文網址或檔案

現在使用中文人口越來越多,遇到中文檔名的機會也越來越大,正好遇到做個筆記。我使用的是NSConnection這個class來下載,這邊暫時不多說它如何使用,只先講 initial它時,在NSURL時,要如下紅字設定


NSURL *url = [NSURL URLWithString:
       [urlpath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSURLRequest *request = [[ [NSURLRequest alloc] initWithURL:url
                             cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
                             timeoutInterval:DL_DELAY] autorelease];

NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];


這就不怕中文名稱的網址或檔名了。

參考網址:

2012年9月4日 星期二

iOS開發筆記 - 做出一個圓角的UIButton

需求
1. 像是UIButtonTypeRoundedRect的圓弧按鈕
2. 可以自由設定

第2點可以自由設定(例如背景顏色啦~等等)這件事,若UIButton初始化時style是UIButtonTypeRoundedRect,之後是改不了的(apple預設的ui,很多都是動不了),所以只能用UIButtonTypeCustom做出自己想要的

這次的例子是做出一個圓弧有外邊緣線的按鈕

Step 1. import <QuartzCore/QuartzCore.h>

Step 2. 初始化一個UIButton

UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(x,y,50,50); // x,y自行設定
btn.layer.borderWidth = 1.0f; //設定邊線寬度
btn.layer.borderColor = [UIColor blackColor].CGColor//設定邊線顏色
btn.layer.masksToBounds = YES;  //這行要有才能顯示出來
btn.layer.cornerRadius = 15.0f//邊角15.0f,自行設定邊角圓弧度


Step 3. 使用.....

就這麼簡單,有些事說穿了不值半毛錢(但我花很久的時間........orz)

參考網址
替 UIImageView 加上圓形遮罩(mask)
为UIButton设置边框等属性

2012年9月3日 星期一

CentOS筆記-載入flahs(隨身碟)

先用底的指令查看剛才放上的隨身碟的名稱
fdisk -l

可以看到類似

Disk /dev/sdc: 16.2 GB, 16225665024 bytes
256 heads, 51 sectors/track, 2427 cylinders
Units = cylinders of 13056 * 512 = 6684672 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1   *           1        2428    15842392    c  W95 FAT32 (LBA)


可以看出是/dev/sdc1,這時在你想mount的地方建個folder,我是在/mnt
mkdir /mnt/flash
mount -t vfat -o iocharset=cp950 /dev/sdc1 /mnt/flash

這樣就成功了,可以做你想要的事了

參考網址:
第八章、Linux 磁碟與檔案系統管理

iOS開發筆記 - app內直接播放YouTube影片(2)

之前曾寫過一篇iOS開發筆記 - app內直接播放YouTuBe影片

那篇做法有幾個問題
  1. 用iFrame內篏,不知道為什麼就是無法autoplay,找了官方文件很久相關資料也無法解決
  2. YouTuBe全螢幕會自動旋轉成橫向,當然也可以轉回直向
  3. 要自己用iOS開發筆記-加button到NavigationBar加Button
  4. 用presentModalViewController去play,即使用第三點所述之方法,會有個問題是恢復後無法操作,會當機

根據以上幾點,那篇的做法,只能UIWebView直接加上去,然後,程式在原UIViewController轉橫向,然後等待使用者按Play,不知道為什麼我就是覺得這樣有點蠢,加上YouTuBe全螢幕後,會出現個按鈕,自己再加上個按鈕,多此一舉.....

最後找到了Auto Play youtube video in iPhone / iPad,重新設計我的概念,大致如下

  1. 用舊式的embeded
  2. 要實作WebView的delegated method
  3. 直接在原 view加上這個WebView

Step 1. ViewController或要使用的那個Class記得加入WebDelegate,如:

@interface RootViewController : UIViewController<UIWebViewDelegate>
@end


Step 2. 建一個新的WebView及實際運作的程式

- (void)showYouTuBe:(NSString*)url
{
    if (__youTubeWebView == nil) {
        __youTubeWebView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; //這邊故意設成橫向大小,不過說實在我不覺得有用就是了
       
        __youTubeWebView.delegate = self;
    }
    
    NSString *embedHTML =@"<html><head></head>"
    "<body style=\"background:#FFFFF;margin-top:20px;margin-left:0px\">"
    "<div><object width=\"%0.0f\" height=\"%0.0f\">"
    "<param name=\"wmode\" value=\"transparent\"></param>"
    "<embed src=\"%@?version=3&f=user_favorites&app=youtube_gdata\""
    "type=\"application/x-shockwave-flash\" wmode=\"transparent\" width=\"%0.0f\" height=\"%0.0f\"></embed>"
    "</object></div></body></html>";
    
    NSString* html = [NSString stringWithFormat:embedHTML, __youTubeWebView.frame.size.width, __youTubeWebView.frame.size.height, url, __youTubeWebView.frame.size.width, __youTubeWebView.frame.size.height];
    
    [__youTubeWebView loadHTMLString:html baseURL:nil];
    __youTubeWebView.backgroundColor = [UIColor clearColor];
    
    [self.view addSubview:__youTubeWebView];
}


Step 3. 寫入Delegate

- (void)webViewDidFinishLoad:(UIWebView *)_webView {
    
    UIButton *b = [self findButtonInView:_webView];
    [b addTarget:self action:@selector(finish:) forControlEvents:UIControlEventTouchUpInside];
    [b sendActionsForControlEvents:UIControlEventTouchUpInside]; //Autoplay
    
}


- (UIButton *)findButtonInView:(UIView *)view {
     UIButton *button = nil;
     if ([view isMemberOfClass:[UIButton class]]) {
          return (UIButton *)view;
     }
     if (view.subviews && [view.subviews count] > 0) {
          for (UIView *subview in view.subviews) {
               button = [self findButtonInView:subview];
               if (button) return button;
          }
     }
     return button;
}

- (void)finish:(id)sender
{
    [__youTubeWebView removeFromSuperview];
}



我在裡頭加上了
[b addTarget:self action:@selector(finish:) forControlEvents:UIControlEventTouchUpInside];

是為按下那個Done按鈕,讓整個WebView消失,見finish這個function

在實測中發現少了sendActionsForControlEvents這個method,就無法自動播放。不想自動播放,可以拿掉它。

感覺還是很多地方是可以調整的,不過要真的試一陣子才知道。

[注意]
這篇所寫所用的YouTuBe的連結,並非直接使用YouTuBe中按下“分享”按鈕的那個連結,而是按下“嵌入”按鈕並勾選“使用舊版內嵌程式碼”,再取得其中的src,例如:

Steve Jobs 賈伯斯 史丹佛大學畢業典禮演說

紅線框起來的部分就是要的網址,後續的變數都在程式碼的embedHTML紅字內,不然就是記得src的內容全copy下來後,將embedHTML中的src內容全改成%@,url的內容就該是copy下來的內容

2012年9月1日 星期六

AdSense-申請 part 3

這週又申請一次AdSense帳號,再次被退,呃~ 會不會上次寫的AdSense-申請 part 2造成反效果....審查人員沒這麼XXX吧....總之....又被退,真的要內容寫多點嗎???總覺得又好像不是這個的問題...最近在學著怎講的精簡點咧~(其實是懶得寫太多.....)

算了,總之下一步
1. 讓程式碼在閱讀上整齊些
2. 盡力簡潔上又能多點內容

iOS開發筆記-加button到NavigationBar

最近想做如下圖這個效果,但不想用UINavigationController,又想要有點它的效果,最後發現可以直接使用NavigationBar


我的需求是一個ViewController,用presentModalViewController加入,最後需要一個button去關閉,而這個bar也要可以隱藏,所以button要跟bar一體,不想用UINavigationController是因為它會佔一個空間(也許是我個人不懂,還沒很徹底的了解它)

可以直接使用NavigationBar,但要加上如圖的button並不是很直覺,先加一個UINavigationItem,再加進bar的items中,再initial一個UIBarButtonItem,就可以放入bar.topItem中,看是要右邊還左邊,我個人是放左邊,程式如下


UINavigationBar *__bar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, 320, 70)];
__bar.barStyle = UIBarStyleBlack;
__bar.translucent = YES;

UINavigationItem *item = [[UINavigationItem alloc] init];
__bar.items = [NSArray arrayWithObject:item];
    
UIBarButtonItem *item1 = [[[UIBarButtonItem alloc] initWithTitle:@"關閉"
                                      style:UIBarButtonItemStyleDone
                                     target:self
                                     action:@selector(close)] autorelease];
__bar.topItem.leftBarButtonItem = item1;


這樣就可以在沒有UINavigationController的狀況下,加入該有的bar及button


參考網址
Add items to NavigationBar (Not using UINavigationController)