2016年3月8日 星期二

【Linux】Linux command - crontab

crontab 是一個很常用, 很容易理解而且很實用的指令, 大部份 crontab 都是用在伺服器上, 例如想定時給資料庫弄個備份, 就會使用到 crontab 了!
簡單來說, crontab 就是工作排程, 讓你定好在什麼時間做什麼事情~
當設定好 crontab 後, 他就會永遠在你設定的時間上執行指令嚕~

安全性:
首先要設定哪些使用者帳號可以使用 crontab 指令
/etc/cron.allow 設定在這檔案裡的使用者帳號才能使用 crontab
/etc/cron.deny 設定在這檔案的使用者帳號不能使用 crontab 
(一列只可以填寫一個使用者帳號啊) 
 格式:
代表意義 分鐘 小時 日期 月份 指令
數字範圍 0-59 0-23 1-31 1-12 0-7 就是指令咧
 過程:
使用 crontab -e 指令後, 會打開 nano 或 vim 的
在裡面一列代表一個工作, 所以記得每次都開新一列喔~
舉個例子來說會比較容易明白~ 假設現在有個用家叫 Bob, 他想每天的下午 3 點和 9 點都寄一封 email 給 Mary, 很簡單的, Bob 輸入 crontab -e 指令後, 在裡面開新一列, 輸入 0 3,9 * * * mail Mary -s "This is a subject"
不同的符號有不同的意思喔

  • " , " = and, 與的意思
  • " - " = range, 一個範圍的意思, 例如每天的 8 點至 12 點 20 分進行一項工作
20 8-12 * * * command

  • " * " = all, 全部的意思
  • " */n " = n 是數字, 代表每隔 n 單位做一次, 例如每 5 分鐘做一項工作
*/5 * * * * command
 
當用家設定完 crontab 後, 工作就會放到 /var/spool/cron 裡面, 以帳號做尾, 也就是以上面 Bob 的例子來說, 工作會紀錄到 /var/spool/cron/bob 裡面 


 
 

【Vagrant】簡單介紹 Vagrant

Vagrant 可以在這裡下載:https://www.vagrantup.com/downloads.html

Vagrant 是一個中間層技術, 一個 virtual box, 是 VMWare 等等的上一層
簡單來說就是 command-line 模式的 Virtual box

Vagrant 提供可配置, 可再生, 便攜的工作環境, 它可以統一團隊工作人員的開發環境
如果伙伴創建了 Vagrantfile, 我們可以通過 Vagrantfile 來初始化開發環境
避免了 "在我的機器上是可以的"

建立 Vagrantfile:
mkdir my_vagrant
cd my_vagrant 
vagrant init
vagrant 的 image 叫 box
執行以上的指令後, 會產生一個本地 box
除了自己建立 box 之外, 我們可以到 vagrant cloud 尋找適合自己的 box 喔

啟動 vagrant:
vagrant up
啟動後可以使用 vagrant ssh 登錄 vagrant
目錄同步: 
默認將項目目錄與虛擬機中的 /vagrant 同步
查詢狀態:
vagrant status
目前處於什麼狀態 ( running / poweroff )
查詢 box 列表:
vagrant box list 
關閉虛擬機:
vagrant halt
重新啟動虛擬機:
vagrant reload

刪除虛擬機:
vagrant destroy
只是在 "虛擬機清單" 上除名, 實際上還在的喔~~
更新虛擬機:
vagrant box update
若更改了虛擬機的provision設定:
vagrant provision
 




2016年3月7日 星期一

【Laravel/Homestead】簡易快速安裝 Laravel - Homestead

Laravel 官方提供了 Homestead
(官方教學文 - https://laravel.com/docs/master/homestead)
Homestead 是一個 使用Ubuntu 的 VM, Laravel 已經為用家們預先安裝了 Laravel 所需要的環境及 Server, 例如 Nginx, MYSQL等等, 在 Windows 及 Mac OSX 上都能夠使用



前置工作:
在安裝 Laravel - Homestead 之前, 我們需要先依次安裝composer及Laravel:




(1) 使用 VM 就當然需要安裝 VM 軟件嚕



(2) 然後需要安裝 Vagrant
想了解什麼是 Vagrant? 請參考【Vagrant】簡單介紹 Vagrant

(3) 安裝完成後, 使用 vagrant 指令把 "laravel/homestead" 這個 box 安裝至 Vagrant     中
      (安裝這個挺花時間的喔~)
vagrant box add laravel/homestead 

(4) 使用 git 指令把 Homestead clone 下來
cd ~
git clone https://github.com/laravel/homestead.git Homestead
clone 下來後, Homestead 資料夾中會有一個 Vagrantfile 檔案, 基本上要執行 vagrant命令就是要透個這個檔案執行, 所以當我的要用 vagrant 指令時, 都要先進到這個目錄才能執行嚕~

(5) 新增 SSH 金鑰
ssh-keygen -t rsa -C "username@homestead"
      *不要忘記把 username  改成自己的使用者帳號喔*
      輸入了這個指令之後一直按 enter 就可以了

(6) 初始化 Homestead

  • 移至 Homestead 目錄
cd ~/Homestead 

  • 使用以下指令來建立 Homestead.yaml 設定檔案, 這個檔案將放置在 ~/.homestead 目錄裡 


bash init.sh
(7)  設定 Homestead
打開 Homestead.yaml (在finder裡按commad+shift+g, 輸入 ~/.homestead), 或直接在終端機輸入以下指令
vim ~/.homestead/Homestead.yaml
 在 Homestead.yaml 設定檔裡:

  • 設定提供者 (provider), 可以是 virtualbox, vmware_fusion, vmware_workstation
provider: virtualbox

  • 設定共享目錄, 設定後將同步更新本機環境與 Homestead 環境 (可設定多個共享環境) 


folders:
    - map: ~/Code
      to: /home/vagrant/Code

  •  設定 sites, sites 幫助我們可以輕易指定網域對應至 homestead 環境目錄中
sites:
    - map: homestead.app
      to: /home/vagrant/Code/Laravel/public
* map 代表本機資料夾, to 代表 VM 資料夾* 
* sites 設定的 map 的值代表 homestead.app 網址, to 的值代表把 map 網址導致哪一個資料夾, 也就是我們在瀏覽器輸入 http://homestead.app, 瀏覽器會顯示 VM 的 /home/vagrant/Code/Laravel/public 網頁* 
 (8) 設定 hosts 檔案

我們需要在 hosts 檔案裡增加網域, 這個檔案會把我們的 Homestead 網站的請求重導至 Homestead 機器
Mac 的用家請到 /etc/hosts 尋找 hosts 檔案 (在 finder 裡按 command+shift+g, 輸入 /etc/hosts), 或使用 sudo vim /etc/hosts 指令直接在終端機修改
 Windows 的路徑是 C:\Windows\System32\drivers\etc\hosts
打開 hosts 檔案後, 請在最底增加以下一列  (不是使用終端機的用家, 建議先把檔案拖曳至桌面, 改動後再拖回去取代喔~)
192.168.10.10  homestead.app
*此 IP 必須與 Homestead.yaml 裡的 IP 相同*
(9) 啟動 Vagrant Box

  • 進入 Homestead 目錄
cd ~/Homestead 

  • 輸入以下指令
vagrant up 



  • 輸入後 Vagrant 會啟動虛擬主機並共享目錄, 輸入 vagrant status, 看到 running就代表你成功了!
(10) 新增 Laravel 專案
如果在新增 Homestead 後改動過 yaml 檔案的 sites 路徑設定, 你會發現該路徑空白一片, 這時候我們就要新增 Laravel 專案了!
composer create-project laravel/laravel project-name --dev-develop
把 project-name 改成自己想要的專案名稱 

完成以上 9 項設定後, 就可以造訪網站了!
http://homestead.app
看到有 Laravel 這個字就代表成功了!

******
備註:
如果沒有修改預設的 Homestead.yaml
那請在 /User/{user-name} 加入 Code 這個資料夾 (因為 Homestead.yaml 裡的預設共享目錄是設定在 Code 裡的)
弄好後再執行一次 vagrant up, 搞定!
******

~。~。~。Homestead 進階小知識~。~。~。

(1) vagrant 捷徑
剛剛提及過, vagrant 指令是透過 vagrantfile 而執行的, 所以每次要啟動 vagrant box 時, 都需要移至 vagrantfile 所在的目錄, 那如果想在不同目錄都能使用 vagrant 指令呢?只需要執行以下指令, 我們就可以在任何位置使用 vagrant 了!
alias homestead='function __homestead() { (cd ~/Homestead && vagrant $*); unset -f __homestead; }; __homestead' 
(2) 連接資料庫
Homestead  的資料庫設定了 MySQL 及 Postgres 兩種, 要從本機電腦做用Navicat 連接資料庫, 我們需要連接 127.0.0.1 的連接埠 33060 (MySQL) 或 54320 (Postgres)
帳號:homestead
密碼:secret 
(3) 使用 SSH 連接 Homestead
除了在終端機使用 vagrant ssh 之外, 我們可以使用 IDE (例如 Netbeans, Eclipse 等等) 來 SSH 進去
如何使用 Eclipse 遠端請參考: 
【Eclipse】遠端同步修改(RSE: Remote System Explorer)
host name 輸入 192.168.10.10
user id 輸入 vagrant
密碼是根據新增 SSH 金鑰時輸入的密碼, 如果沒有新增過 SSH 金鑰, 那預設的密碼就是 vagrant
(4) Homestead 的連接埠
  • SSH2222 轉發至 22
  • HTTP8000 轉發至 80
  • HTTPS44300 轉發至 443
  • MySQL33060 轉發至 3306
  • Postgres54320 轉發至 5432
(5) 一個 Homestead 只能新增一個網域嗎?如果我想把幾個網站放進去那怎辦?
一個 Homestead 能新增多個網域的啊~就打開 homestead.yaml 新增 folders 和 sites, 儲存後執行 vagrant provision 指令就可以了!




2016年3月6日 星期日

【Mac/Laravel】簡易快速安裝 Laravel

(1) 在安裝 Laravel 之前, 我們要先安裝 Composer
     Composer 的教學請看 【Mac/Composer】簡易快速安裝 Composer

(2) 安裝 Composer 後, 請確認 ~/.composer/vendor/bin 有沒有 laravel 及其相依性套件

(3) 然後把 ~/.composer/vendor/bin 放到 $PATH, 步驟如下
          
          (3.1) 打開 bash_profile
                   vim ~/.bash_profile

          (3.2) 打開後在最底加一列 ( {user-name}要改成自己的使用者名稱啊 )
                   export PATH=/Users/{user-name}/.composer/vendor/bin:$PATH

          (3.3) 儲存後令它立刻生效
                   source ~/.bash_profile

最後在任何位置嘗試輸入 laravel , 有反應就代表成功了!



【Mac/Composer】簡易快速安裝 Composer

Composer 是一個 PHP 的依賴性管理工具, 它能讓你宣告你的專案需要的依賴函式庫, 並為你在你的專案中安裝他們~
簡單來說, 就是我們不需要再因為更新了一個套件, 而去煩惱其他相關套件的版本相容性問題嚕嚕~^0^~

在 Mac 上安裝 Composer 是非常簡單的喔~

(1) 首先, 在任何位置輸入以下指令 (這個指令是用 Mac 內建的 curl 下載 Composer)

curl -sS https://getcomposer.org/installer | php

下載下來的 composer.phar 就是可以執行的程式, 但由於我們想在其他地方使用, 所以需要把它放到 /usr/local/bin

(2) 輸入以下指令把 composer.phar 移動到 usr/local/bin

sudo mv composer.phar /usr/local/bin/composer

(3) 完成以上兩個步驟後, 現在只要在任何地方輸入以下指令, 就會在 ~/.composer/vendor/ 裡安裝 laravel 及其相依性套件了~!!

composer global require "laravel/installer=~1.1"


更新composer(有可能有permission問題所以要加sudo -i):
sudo -i /usr/local/bin/composer self-update

當然可以不用直接composer, 不用輸入path也可以
sudo -i composer self-update

如果想還原前一個版本:
sudo -i composer self-update —rollback     

2016年3月2日 星期三

【iOS/Facebook】在 iOS 上加入 Facebook 登入功能

現在很多應用程式都會使用 Facebook SDK 來加入 Facebook 功能
這有幾大主要原因
其一是基本上有用智能手機的用家都有至少一個 Facebook 帳號, 因此不用特意再去註冊普通帳號, 直接拿 Facebook 的 fbid 來當帳號, 就可以省去了用家在註冊上的麻煩了
其二是使用分享邀請等功能, 在社交平台上作宣傳, 省去了一筆費用

要使用 Facebook  登入, 首先要下載 Facebook SDK 及建立申請 Facebook App
詳情請看【iOS/Facebook】Facebook SDK 在 iOS 上的設定及事前準備

然後把 FBSDKLoginKit.framework 拖入xcode project 裡

設定完成後, 就可以開始嵌入 Facebook Login 了!

在需要加入 Login Button 的 Class 裡, 都需要 import FBSDKCoreKit.h 及 FBSDKLoginKit.h
夜雪在這篇文章裡使用的 class 是 viewController 

在 viewController.h 裡
Import FBSDKCoreKit.h 及 FBSDKLoginKit.h
#import <FBSDKCoreKit/FBSDKCoreKit.h>

#import <FBSDKLoginKit/FBSDKLoginKit.h>

宣告Button
@property (weak, nonatomic) IBOutlet FBSDKLoginButton *loginButton;

加入後 viewController.h 應該是這樣子的~

然後在 viewController.m 裡
加入@synthesize
@synthesize loginButton; 

--------------------------------------
【預設 Facebook Login Button】

打開 viewController.m

在 viewDidLoad 裡加入 Facebook Login Button
  loginButton = [[FBSDKLoginButton alloc] init];
  // Optional: Place the button in the center of your view.
  loginButton.center = self.view.center;

  [self.view addSubview:loginButton];

然後要問取權限 (要用家確認了權限才能拿到用家的資料喔)
loginButton.readPermissions = 
  @[@"public_profile", @"email", @"user_friends"];

加入後 viewController.m 應該是這樣子的~

預設的 Facebook Login Button 就完成了!
我們來看看樣子~~

--------------------------------------
【自定義 Login Button (不使用Storyboard)】

很多開發者都不會用預設的 Facebook Login Button, 我想可能是因為設計或是美觀上的問題吧? 因為夜雪都不太喜歡使用預設的東東啊...呵呵~
接下來介紹一下自定義 Login Button , 先說說不使用 Storyboard 的做法吧~

打開 viewController.m
在 viewDidLoad 裡建立及自定義一個 Button , 然後把他設定成按下後會跳去 loginButtonClicked 這個 function
UIButton *myLoginButton=[UIButton buttonWithType:UIButtonTypeCustom];
  myLoginButton.backgroundColor=[UIColor darkGrayColor];
  myLoginButton.frame=CGRectMake(0,0,180,40);
  myLoginButton.center = self.view.center;
  [myLoginButton setTitle: @"My Login Button" forState: UIControlStateNormal];

  // Handle clicks on the button
  [myLoginButton 
    addTarget:self 
    action:@selector(loginButtonClicked) forControlEvents:UIControlEventTouchUpInside];

  // Add the button to the view

  [self.view addSubview:myLoginButton];

然後可以建立 loginButtonClicked function
我們在這個 function 裡使用 FBSDKLoginManager 處理 Facebook Login
-(void)loginButtonClicked
{
  FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
  [login
    logInWithReadPermissions: @[@"public_profile", @"email", @"user_friends"]
          fromViewController:self
                     handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
    if (error) { 
      NSLog(@"Process error");
    } else if (result.isCancelled) {
      NSLog(@"Cancelled");
    } else {
      NSLog(@"Logged in");
    }
  }];

}

這就完成了!

--------------------------------------
【自定義 Login Button (使用Storyboard)】

使用 Storyboard 是更簡單, 方便, 快捷的!
我們只需要在 Storyboard 裡拖出一個 Button, 然後 Ctrl + drag  到空白地方再放手


之後在 Connection 選擇 Action, name 打 自定義的 function 名稱


facebookLogin 是 夜雪自定義的 function 名稱啊~
然後這個 function 的內容啊..就跟 【自定義 Login Button (不使用 Storyboard)】裡的 loginButtonClicked 內容相同的啊~很簡單對吧~呵呵~

--------------------------------------
【Access Token】

當用家成功登入後, Facebook 會回傳一個 Access Token 回來的~
沒有 Access Token, 就拿不到用家的資料, 什麼也做不了~

拿取 Access Token 的方法是:
Facebook SDK 版本是 4.1 之前
NSString *fbAccessToken = [[[FBSession activeSession] accessTokenData] accessToken];
4.1 或之後
NSString *fbAccessToken = [FBSDKAccessToken currentAccessToken].tokenString;

--------------------------------------
【登入後拿取用家基本資料】

拿取玩家資料, 剛剛也說過了, 首先要有 Access Token ~
找個 function 裝著而下一段, 又或是放在剛剛我們建立的 loginButtonClicked 的 NSLog(@"Logged in"); 下面

[[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields": @"id, name, email"}] startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error1) {
        if(!error1){
            NSLog(@"user fbid:%@", [result objectForKey:@"id"]);
            NSLog(@"user name:%@", [result objectForKey:@"name"]);
            NSLog(@"accessToken:%@", [[FBSDKAccessToken currentAccessToken] tokenString]);
        }else{
            NSLog(@"error");
        }

    }];

這裡其實是使用了 Facebook 的 Graph API, 基本上要拿取資料就會用到 Graph API 的
至於拿取什麼資料, 就在 parameters:@{@"fields"@"id, name, email"} 這裡輸入, 現在這裡請求的就是用家的 fbid, name 及 email 了~

--------------------------------------
【Logout】

使用預設 Login Button 的朋友可以不用理會~因為預設的已經弄了 Logout 功能啊~
首先要先檢查用家有沒有登入~

有的使用 FBSDKMAnager 的 logOut function 就可以了
把 loginButtonClicked 改成

FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
    if([FBSDKAccessToken currentAccessToken]){
        [login logOut];
        NSLog(@"Logout");
    }else{
        
        [login
         logInWithReadPermissions: @[@"public_profile", @"email", @"user_friends"]
         fromViewController:self
         handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
             if (error) {
                 NSLog(@"Process error");
             } else if (result.isCancelled) {
                 NSLog(@"Cancelled");
             } else {
                 NSLog(@"Logged in");
             }
         }];

    }

就能成功登出了!
****************
注意:logOut function只是把 Access Token 清掉而已, 所以再按登入時是沒有地方讓你輸入帳號和密碼的
原因嘛...那是因為現在的 Facebook 是跟 Safari 用同一個 cookie 的, 所以如果要真正的 Logout 讓別的用家登入啊, 是需要去 Safari 那邊 Logout 的喔
****************
有時候可能會出現  canOpenURL: failed for URL: "fbauth2:/" - error: "(null)" 這個錯誤訊息的
但如果已經在 plist 設定了 LSApplicationQueriesSchemes, 那就不需要理會了~
****************